移除链表元素

本文介绍了如何在单链表中删除所有等于给定值的节点,通过创建一个哨兵结点简化了边界条件的处理,使得删除操作更加高效。详细步骤包括初始化哨兵结点,定义双指针并遍历链表,当找到目标值时断开连接,否则指针后移。最后返回哨兵结点的下一个结点作为新的链表头。

删除链表中等于给定值 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;
                   
    }
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值