[路飞]_leetcode_83.删除排序链表中的重复元素

83 阅读1分钟

思考

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

首先,可以确定的是 链表是有序链表,然后重复的元素肯定是紧挨着的。

解题思路

设 pre = head, cur = head.next:

  1. cur节点移动到null,退出循环;
  2. 判断pre的val是否等于cur的val;
    1. 不相等,则pre直接指向cur,pre移动到cur,cur移动到下一位;
    2. 相等,cur继续向下走。
  3. 重复上述步骤
pre    cur
head -> 1 -> 1 -> 2 -> 3 -> 3 -> null;
       pre  cur
head -> 1 -> 1 -> 2 -> 3 -> 3 -> null;
       pre       cur
head -> 1 -> 1 -> 2 -> 3 -> 3 -> null;
       pre       cur
head -> 1      -> 2 -> 3 -> 3 -> null;
                 pre  cur
head -> 1      -> 2 -> 3 -> 3 -> null;
                      pre  cur
head -> 1      -> 2 -> 3 -> 3 -> null;
                      pre        cur
head -> 1      -> 2 -> 3 -> 3 -> null;
                      pre        cur
head -> 1      -> 2 -> 3      -> null;

代码

var deleteDuplicates = function(head) {
    if (!head) return head;
    let pre = head, cur = head.next;
    while (cur) {
        if (pre.val != cur.val) {
            pre.next = cur;
            pre = cur;
            cur = cur.next;
        } else {
            cur = cur.next;
        }
    }
    pre.next = null;
    
    return head;
};