使用临时缓冲区:
哈希表存储出现过的节点值,如果当前节点出现过,就删掉。(效率还是要高很多)
const removeDuplicateNodes = (head) => {
if (head == null) {
return head;
}
const set = new Set();
set.add(head.val);
let prev = head; // head是存在的,赋给prev
let cur = head.next; // head是存在的,它的next赋给cur
while (cur) {
if (set.has(cur.val)) { // 如果当前节点是重复的
prev.next = cur.next; // 让prev的next直接指向cur的next,完成删除
cur = cur.next; // 更新一下cur
} else {
set.add(cur.val); // 当前节点是第一次出现,存储一下
prev = prev.next; // prev和cur都更新一下,跳到下一个
cur = cur.next;
}
}
return head; // 返回删除重复节点后的链表
};
不使用缓冲区:
那就是双指针:
但是时间复杂度是O(n)的
const removeDuplicateNodes = (head) => {
let p = head;
while (p) {
let q = p;
while (q.next) {
if (q.next.val == p.val) {
q.next = q.next.next;
} else {
q = q.next;
}
}
p = p.next;
}
return head;
};