浅析LeetCode 83删除排序链表中的重复元素

描述

一、题目描述

给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。

null

二、题目解析

由于给定的链表是排好序的,因此重复的元素在链表中出现的位置是连续的,这个很关键。

因此我们只需要对链表进行一次遍历,就可以删除重复的元素。

具体操作如下:

1、设置一个指针 cur,指向链表的头节点,从链表的头节点开始访问每一个节点。

null

2、开始不断遍历链表。

3、在访问过程中,只要当前节点和当前节点的下一个节点有值,就不断访问下去

4、当前节点和当前节点的下一个节点有两种关系。

5、当前节点和当前节点的下一个节点相同,此时要删除重复元素, 由于链表已经是排序的,所以去重操作只需要跳过后面这个重复的节点就行。

6、当前节点和当前节点的下一个节点不相同,那么 cur 这个节点可以保留下来,继续访问后面的节点

三、参考代码

 

// LeetCode 100 题精讲:https://mp.weixin.qq.com/s/yznC53g46phq3qF7V4-obA
// 作者:程序员吴师兄
// https://leetcode-cn.com/problems/remove-duplicates-from-sorted-list/
class Solution {
    public ListNode deleteDuplicates(ListNode head) {
        // 从链表的头节点开始访问每一个节点
        ListNode cur = head;

        // 在访问过程中,只要当前节点和当前节点的下一个节点有值,就不断访问下去
        while(cur != null && cur.next != null) {

            // 当前节点和当前节点的下一个节点有两种关系

            // 1、当前节点和当前节点的下一个节点相同,此时要删除重复元素
            // 由于链表已经是排序的,所以去重操作只需要跳过后面这个重复的节点就行
            if(cur.val == cur.next.val) {

                // 执行这个操作之后,cur.next 被跳过去了
                cur.next = cur.next.next;

            // 2、当前节点和当前节点的下一个节点不相同,那么 cur 这个节点可以保留下来,继续访问后面的节点
            } else {
                // 继续访问后面的节点
                cur = cur.next;
            }
        }

        // 返回链表的头节点就是结果
        return head;
    }
}

 






审核编辑:刘清

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分