力扣第八十三题-删除排序链表中的重复元素

316 阅读3分钟

「这是我参与11月更文挑战的第10天,活动详情查看:2021最后一次更文挑战

前言

力扣第八十三题 删除排序链表中的重复元素 如下所示:

存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除所有重复的元素,使每个元素 只出现一次 。

返回同样按升序排列的结果链表。

示例 1:

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

示例 2:

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

一、思路

这一题和力扣第八十二题非常的像,那个是需要删除链表中所有的重复元素(不保留重复的元素),这个是只需要删除重复的元素,使每个元素只出现一次,有兴趣的也可以看一下上一题。

因为我们可以通过当前元素 current 和下一个元素 next 就能比较出下一个元素 next 是否重复,所以是不需要 前置元素 的。

实现的大致步骤如下所示:

current : 指向当前的元素
next:指向当前元素的下一个元素

  1. current 指向第一个元素,next 指向第二个元素
  2. 开始遍历链表,当 next 为空时结束遍历
  3. 如果再遍历的过程中出现了 next 的值与 current 的值相同,说明出现了重复值,则让 next 一直向下,直到找到与 current 不相同的元素。让后将 current 的下一个节点指向 next,再将 current 移动到新的头节点,即 current 指向 next,再将 next 指向 next 的下一个元素
  4. 如果 currentnext 的值不相同,则都指向自身的下一个元素即可
  5. 返回原来的头节点 head 作为结果即可

举个例子

此处以示例中的 head = [1,1,2,3,3] 作为例子

  1. 初始化:current 指向第一个节点,next指向第二个节点
  2. 开始遍历,此时出现了 current.val == next.val,故向下移动 next,直到 next 指向 2。然后再将 current.next = next; current = next; next = next.next
  3. 继续遍历,currentnext指向的 23 不相等,故都向下移动。current = current.next; next = next.next
  4. 继续遍历,currentnext指向的 33 相等,故向下移动 next,直到 next 移出了链表,即 next = null。此时更新 current 即可, current.next = next; current = next
  5. 返回原先的 head 节点,链表已变成了 1 -> 2 -> 3

二、实现

实现代码

实现代码与思路中保持一致

    public ListNode deleteDuplicates(ListNode head) {
        // 特殊情况(只有一个元素或没有元素)
        if (head == null || head.next == null)
            return head;
        ListNode current = head;
        ListNode next = head.next;
        while (next != null) {
            // 如果有元素重复
            if (next.val == current.val) {
                while (next != null && next.val == current.val) {
                    next = next.next;
                }
                current.next = next;
                current = next;
                if (next == null) { // 如果没有元素了,结束循环
                    break;
                }
                next = next.next;
            } else {
                current = current.next;
                next = next.next;
            }

        }
        return head;
    }

测试代码

    public static void main(String[] args) {
        ListNode listNode1 = new ListNode(1, new ListNode(1, new ListNode(2, new ListNode(3, new ListNode(3)))));
        ListNode listNode2 = new ListNode(1, new ListNode(2, new ListNode(3, new ListNode(3, new ListNode(4, new ListNode(4, new ListNode(5)))))));
        ListNode listNode3 = new ListNode(1, new ListNode(1));
        new Number83().deleteDuplicates(listNode1);
    }

结果

image.png

三、总结

感谢看到最后,非常荣幸能够帮助到你~♥

如果你觉得我写的还不错的话,不妨给我点个赞吧!如有疑问,也可评论区见~