Skip to main content

移除重复节点

01. 移除重复节点

编写代码,移除未排序链表中的重复节点。保留最开始出现的节点。

示例 1:

输入:[1, 2, 3, 3, 2, 1]
输出:[1, 2, 3]

示例 2:

输入:[1, 2, 3, 3, 2, 1]
输出:[1, 2, 3]

代码

const head = {
'val':1,
'next':{
'val':2,
'next':{
'val':3,
'next':{
'val':3,
'next':{
'val':2,
'next':undefined
}
}
}
}
}

思路:

  1. 首先创建一个 set,用来保存唯一的值。
  2. 为了遍历链表,先定义一个指针, 用于指向当前的节点。 遍历的时候检查当前节点的值是否在 set 里面
  3. 如果没有, 就添加; 如果有,说明这个节点需要被移除, 移除的时候需要把当前节点的前一个节点的 next 指针改为当前节点的下一个节点, 所以需要再定义另外一个指针, 用来记录前一个节点。
class LinkNode {
constructor(val,next){
this.val = val
this.next = next || null
}
}

var removeDuplicateNodes = function(head) {
let set = new Set()

// 拷贝
let slow = head
let fast = head

while(fast){
if(!set.has(fast.val)){// 不存在
set.add(fast.val)
// 慢指针记录
slow = fast
}else{ // 存在
// 慢指针干预:向前跳一位
slow.next = fast.next // 此时可以对原数据进行改变??
}

fast = fast.next
}

return head
};

console.log(removeDuplicateNodes(head))