删除链表中等于给定值 val 的所有节点。
示例:
输入: 1->2->6->3->4->5->6, val = 6
输出: 1->2->3->4->5
此处两个6已移除。
分析:
1.如果要删除的结点,刚好在中间
则:pre.next = cur.next;
2.如果要删除的结点在首部几个,处理起来较麻烦
如: 1,1,1,2,3,4 val = 1
结果: 2,3,4
这种情况删除需要借助哨兵结点:
这里补充哨兵结点的作用:
sentinel
哨兵结点广泛用于树和链表中,如伪头,伪尾,标记等。
它是纯功能的,通常不保存任何数据,
主要目的:使链表标准化,如使链表永不为空,永不无头
简化插入和删除操作
这里是伪头作用
思路:
1.初始化一个哨兵结点 sentinel 设置ListNode(0);
sentinel = head;
2.定义两个指针初始化:前驱结点pre , 要删除结点cur
pre = head , cur = head;
3.如果cur指向的不为空。则 继续往下寻找。
找到,则 pre.next = cur.next;
没有,则两指针都往后移:pre = cur; cur = cur.next;
4.返回伪结点后一个结点 : sentinel.next;
代码实现:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode removeElements(ListNode head, int val) {
ListNode sentinel = new ListNode(0);
sentinel.next = head;
ListNode pre = sentinel,cur = head; //两指针初始化
while(cur != null){
if(cur.val == val) pre.next = cur.next; //找到则删除
else pre = cur; //没找到,两指针后移
cur = cur.next;
}
return sentinel.next;
}
}
本文介绍了如何在单链表中删除所有等于给定值的节点,通过创建一个哨兵结点简化了边界条件的处理,使得删除操作更加高效。详细步骤包括初始化哨兵结点,定义双指针并遍历链表,当找到目标值时断开连接,否则指针后移。最后返回哨兵结点的下一个结点作为新的链表头。
473

被折叠的 条评论
为什么被折叠?



