相关推荐recommended
算法每日一题: 删除排序列表中的重复元素2 | 循环 | 链表的删除 | 虚拟节点
作者:mmseoamin日期:2024-01-19

大家好,我是星恒

今天的题目是昨天题目的进化题,他对链表的删除加深了理解。最重要的是学会了对循环中的特殊部分的处理,还有设置虚拟节点的情况

好了,话不多说,我们直接开始

题目:leetcode 82
给定一个已排序的链表的头 head , 删除原始链表中所有重复数字的节点,只留下不同的数字 。返回 已排序的链表

示例:

示例 1:
[外链图片转存中…(img-qsrtHDAg-1705333692489)]

输入:head = [1,2,3,3,4,4,5]
输出:[1,2,5]

示例 2:
[外链图片转存中…(img-SIQvpZrX-1705333692490)]

输入:head = [1,1,1,2,3]
输出:[2,3]

提示:

  • 链表中节点数目在范围 [0, 300] 内
  • -100 <= Node.val <= 100
  • 题目数据保证链表已经按升序 排列

    分析:
    由于我们是要删除,所以我们需要知道删除节点的前一个节点。我们遍历该链表,当遇到当前值的下一个值和下下个值相同时,把他们删除,并记录该值,然后看后面的情况

    题解:

    class Solution {
        public ListNode deleteDuplicates(ListNode head) {
            if (head == null) {
                return head;
            }
            
            ListNode dummy = new ListNode(0, head);
            ListNode cur = dummy;
            while (cur.next != null && cur.next.next != null) {
                if (cur.next.val == cur.next.next.val) {
                    int x = cur.next.val;
                    while (cur.next != null && cur.next.val == x) {
                        cur.next = cur.next.next;
                    }
                } else {
                    cur = cur.next;
                }
            }
            return dummy.next;
        }
    }
    

    收获/亮点:

    • 虚拟节点的设置:当访问时,访问不到头结点情况时(尤其是使用**.next.next**最容易出现此情况),我们可知设置头结点来访问到头结点
    • 当两个指针出现时,访问结束的条件一般都是两个
    • if 中的循环,一般使用就是在遍历访问时,有一段循环需要特殊的处理,我们可以使用 if - while 来推进一段进程

      如果大家有什么思考和问题,可以在评论区讨论,也可以私信我,很乐意为大家效劳。
      好啦,今天的每日一题到这里就结束了,如果大家觉得有用,可以可以给我一个小小的赞呢,我们下期再见!