和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
};