题目
编写代码,移除未排序链表中的重复节点。保留最开始出现的节点。
示例1:
输入:[1, 2, 3, 3, 2, 1] 输出:[1, 2, 3]
示例2:输入:[1, 1, 1, 1, 2] 输出:[1, 2]
提示:链表长度在[0, 20000]范围内。 链表元素在[0, 20000]范围内。
思路
关键是定义一个set集合来剔除重复值
解
/**
* Definition for singly-linked list.
* class ListNode {
* val: number
* next: ListNode | null
* constructor(val?: number, next?: ListNode | null) {
* this.val = (val===undefined ? 0 : val)
* this.next = (next===undefined ? null : next)
* }
* }
*/
function removeDuplicateNodes(head: ListNode | null): ListNode | null {
if(head == null){//head为空,直接返回
return head;
}
let sets = new Set();// 定义一个set集合
sets.add(head.val);// 将第一个值add进sets里
let prev = head;
let cur = head.next;
while (cur) {
if (sets.has(cur.val)) {// 如果已经有这个值,则做删除操作
prev.next = cur.next;// 不遍历prev的next,直接跳过
cur = cur.next;// 更新一下cur
} else {
sets.add(cur.val); //添加到不存在的val到sets
prev = prev.next; // 更新一下prev
cur = cur.next;// 更新一下cur
}
}
return head;
};