算法每日一题: 删除排序列表中的重复元素2 | 循环 | 链表的删除 | 虚拟节点

发布时间:2024年01月16日

大家好,我是星恒
今天的题目是昨天题目的进化题,他对链表的删除加深了理解。最重要的是学会了对循环中的特殊部分的处理,还有设置虚拟节点的情况
好了,话不多说,我们直接开始

题目: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 来推进一段进程

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

文章来源:https://blog.csdn.net/m0_61780691/article/details/135613844
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。