删除排序链表中的重复元素

337 阅读1分钟

要求

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

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

思路1

创建一个pre指向head

创建一个cur指向head.next

当pre.val == cur.val

pre.next = cur.next

pre指向cur

cur指向cur.next

var deleteDuplicates = function (head) {
    if (!head) return null;
    let ret = new ListNode(-1, head),
        pre = head,
        cur = head.next;
    while (cur) {
        if (pre.val === cur.val) {
            pre.next = cur.next;
            pre = cur.next;
            if(!pre) break;
            cur = pre.next;
        } else {
            pre = pre.next;
            cur = cur.next;
        }
    }
    return ret.next;
};

但这个情况下,只能处理重复的元素只出现两次

思路2

创建一个pre指向head

创建一个cur指向head.next

当pre.val != cur.val

pre指向cur,cur指向cur.next

当pre.val == cur.val 只做cur的指针指向下一个:cur = cur.next 的操作 这样,重复的元素出现多次都可以删除掉

代码

var deleteDuplicates = function (head) {
    // 当传入的head为空,直接返回null
    if (!head) return null;
    // 创建两个指针,指向head和head.next,用来判断val是否相等
    let pre = head,
        cur = head.next;
    // 当cur不为空时,才进入循环,cur为空则代表已经把链表遍历完了
    while (cur) {
        // 当pre的值与cur的值不相等,则两节点不重复
        if (pre.val != cur.val) {
            // 当前pre指向的节点的next指向当前cur
            pre.next = cur;
            // pre指针指向当前cur指针指着的节点
            pre = cur;
            // cur指针指向当前cur指针指着的节点的下一节点
            cur = cur.next;
        } else {
            // 当pre指着的节点的值与cur指着的节点的值相等,两节点重复了,cur指针指向下一节点,继续往下寻找pre节点不等的节点
            cur = cur.next;
        }
    }
    // while循环出来后,如果最后pre节点与cur节点重复了,pre直接指向null,如果不重复,则pre会指向最后一个节点
    pre.next = null;
    return head;
};
};