题目概述(简单难度)
给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。
示例 1:
输入:head = [1,2,6,3,4,5,6], val = 6 输出:[1,2,3,4,5]
示例 2:
输入:head = [], val = 1 输出:[]
示例 3:
输入:head = [7,7,7,7], val = 7 输出:[]
在此附上leetcode链接:
点击此处进入leetcode
思路与代码
思路展现
这道题目的思路是这样的:
1:首先定义两个指针变量cur和prev,prev指针一开始指向我们的头节点head,cur指针一开始指向我们的头节点的下一个节点.
2:此时我们先不去判断我们头节点是否是需要删除的节点,先从第二个节点开始判断,最后再判断我们的头节点.
3:然后从cur指向的节点开始遍历我们的链表,如果此时cur所指向的节点的值域与所提供的val值相同,那么prev的next域指向cur所指向的节点的下一个节点,逻辑上来说此时相当于删除了cur所指向的节点,然后cur继续往下遍历,当cur所指向的节点的值域与所提供的val值不相同时,让prev指针此时也指向cur指针此时指向的节点,然后cur指针继续向下遍历.
4:最后我们再来判断head指针指向的头节点的值域是否与提供的val值相同,如果相同,就让头指针指向其next域存储的节点.最后返回head这个头指针即可.
代码示例
class Solution { public ListNode removeElements(ListNode head, int val) { if (head == null) { return null; } ListNode prev = head; ListNode cur = prev.next; while (cur != null) { if(cur.val == val) { prev.next = cur.next; }else { prev = cur; } cur = cur.next; } /* 在这里写这个if方法是为了应对此种特殊情况,假设此时有一组链表,存储的数据为 78,78,78,78,10,假设我们此时不写这个if语句,要去删除key值为78的节点 则最终删除完毕后,我们会发现结果为78,10,原因是第二个78未被删除掉,所以最后 当我们执行完上述的删除工作后,还需要在判断下删除完成后的首节点是否为78,如果是,则也需要删掉 */ if(head.val == val) { head = head.next; } return head; } }
总结
1:此算法:
时间复杂度:O(N)
空间复杂度:O(1)
2:着重还是复习思路.