【Leetcode】83.删除排序链表中的重复元素

55 阅读1分钟

leetcode-83.png

82题一起配合食用
这一题可以留下一个重复的节点,82题就是去掉所有重复的点 首先想到的是快慢指针来解决这一题,但是其实不用双指针也能解决这一题
再一个思考就是,关于头节点是否需要dummy来指向head,在这一题,没有必要这么做,因为快慢指针直接来改变原先的链表结构,head没有动,后面直接返回head即可

解法1

var deleteDuplicates = function (head) {
    if (!head) return null
    let slow = head, fast = head
    while (fast) {
        // 需要注意首先判断fast是否存在
        // 因为在进行while循环的过程中,fast到尾部的时候
        // fast = null,此时fast.val就会报错了
        while (fast && slow.val === fast.val) {
            fast = fast.next
        }
        // not equal
        slow.next = fast
        // move point
        slow = slow.next
    }
    return head
};

解法2

再就是另外一种解法, 不需要slow还有fast这种双指针来解决问题
如果这里是一个数组,通常就是用双指针来解决问题,但是这里的结构比较特殊,是链表
所以基于这种结构上,我们一个指针即可

var deleteDuplicates = function (head) {
    if (!head) return null
    let current = head
    while (current) {
        // 判断相邻的两个节点是否相等
        if (current.next && current.val === current.next.val) {
            // 相等则把 cur 指向 cur的下下个节点
            // 所以基于这种信息,每次都可以跟相邻的节点比较
            // 相邻的节点相等,直接再把 cur的下下个节点变成 cur的相邻节点
            current.next = current.next.next
        } else {
            // 不相等则到下一节点去ƒ
            current = current.next
        }
    }
    return head
};

解法3

思路跟上面的解法一致,写法有一丢丢不同

var deleteDuplicates = function (head) {
    let current = head
    while (current) {
        // 跳过重复的点
        while (current.next && current.val === current.next.val) {
            current.next = current.next.next
        }
        // 不重复的直接挪动到下一个点
        current = current.next
    }
    return head
};