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

1,988 阅读1分钟

要求

存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除链表中所有存在数字重复情况的节点,只保留原始链表中 没有重复出现 的数字。

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

思路

要删除节点,就要找到删除节点的前一个节点,所以应该head.next.val == head.next.next.val这样判断

当两个val不相等,则继续往下寻找

当两个val相等,cur往下走,pre不需要动

直到cur找到cur.next.val != pre.next.val的节点,使pre改变当前指针所指的下一节点,即pre.next = cur.next

代码

var deleteDuplicates = function (head) {
    // 当传进来的head为空,直接return
    if (!head) return null;
    // 设置一个虚拟头,因为需要删除pre.next,当head的第一第二节点重复需要删除时,要用到虚拟头
    let ret = new ListNode(-1, head),
    // pre指向虚拟头,当第一第二节点重复时,才能实现删除
        pre = ret,
        cur = head;
    // 为什么要判断cur&&cur.next不为空?
    // 因为当cur和cur.next不为空时,才能判断cur.next是否与前面的节点重复
    while (cur && cur.next) {
        // 当两节点不重复,各往下走一步
        if (pre.next.val != cur.next.val) {
            pre = pre.next;
            cur = cur.next;
        // 重复了
        } else {
            // 则cur继续往下面走,直到找到与当前pre.val不重复的节点
            while (cur.next && pre.next.val == cur.next.val) {
                cur = cur.next;
            }
            // 然后pre.next = cur.next,改变pre的下一个节点的指向
            pre.next = cur.next;
            // cur指针改变指向
            cur = cur.next;
        }
    }
    return ret.next;
};