移除链表元素

    科技2024-07-19  66

    删除链表中等于给定值 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; } }
    Processed: 0.008, SQL: 8