问题描述

假设有这样一串珠子,上面有一些数字。这些数字是按照从小到大的顺序排列的。现在我们要做的是去掉那些重复的数字,只保留每个数字第一次出现的那个珠子。

示例

  • 输入:1 → 1 → 2
  • 输出:1 → 2
  • 输入:1 → 1 → 2 → 3 → 3
  • 输出:1 → 2 → 3

解决方法

我们可以用一个简单的步骤来解决这个问题:

  1. 从头开始
  2. 我们从第一个珠子开始看。
  3. 比较相邻的珠子
  4. 每次我们看看当前珠子上的数字和它后面的珠子上的数字是不是一样的。
  5. 跳过重复的珠子
  6. 如果当前珠子和后面的珠子数字一样,我们就跳过后面的珠子。
  7. 继续往前走
  8. 如果不一样,我们就把手指(也就是我们用来看珠子的那个点)向前移动一格。
  9. 一直做到最后
  10. 直到我们看到了最后一个珠子为止。

具体步骤

假设我们有一串珠子:1 → 1 → 2 → 3 → 3

  1. 从头开始
  2. 我们从第一个珠子 1 开始看。
  3. 比较相邻的珠子
  4. 第一个珠子 1 和第二个珠子 1 是一样的。
  5. 跳过重复的珠子
  6. 所以我们把第二个珠子 1 跳过,直接连接到第三个珠子 2
  7. 继续往前走
  8. 接下来我们看 1 和 2,它们不一样,所以我们把手指移到 2 上。
  9. 继续比较
  10. 接下来我们看 2 和 3,它们不一样,所以再把手指移到 3 上。
  11. 继续比较
  12. 最后我们看 3 和 3,它们是一样的,所以我们把第二个 3 跳过,直接连接到最后。
  13. 一直做到最后
  14. 现在我们到了最后一个珠子,没有更多的珠子可以比较了。

最终结果

经过上述步骤之后,我们得到的结果就是:1 → 2 → 3

代码实现

接下来,我们用简单的 Java 代码来实现这个过程:

import java.util.*;

class Solution {

    // 删除链表中的重复元素
    public ListNode deleteDuplicates(ListNode head) {
        ListNode current = head;
        
        // 遍历链表,直到当前节点的下一个节点为空
        while (current != null && current.next != null) {
            if (current.val == current.next.val) {
                // 跳过重复的节点
                current.next = current.next.next;
            } else {
                // 移动到下一个节点
                current = current.next;
            }
        }
        
        return head;
    }

}

测试

你可以使用不同的输入来测试这段代码是否正确地删除了链表中的重复元素:

示例1

输入:{1, 1, 2}

  • 原链表:1 → 1 → 2
  • 处理后:1 → 2

示例2

输入:{1, 1, 2, 3, 3}

  • 原链表:1 → 1 → 2 → 3 → 3
  • 处理后:1 → 2 → 3

如果这篇文章对你有帮助,请点个免费的赞👍,让它能帮助到更多的人。