82. 删除排序链表中的重复元素 II(JS实现)
82. 删除排序链表中的重复元素 II(JS实现)
1 题目
给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字。
示例 1:
输入: 1->2->3->3->4->4->5
输出: 1->2->5
示例 2:
输入: 1->1->1->2->3
输出: 2->3
2 思路
这道题的思路主要思路还是双指针,prev指针上一个元素,head指针遍历每个元素,当prev和head指向的元素值不同时,两者同时向后移动,当prev和head指向的元素值相同时,此时说明出现重复元素,那么prev指针不动,head指针继续向后搜索直到找到不同的元素,然后修改指针指向,将重复元素段移除。
3代码
/**
* Definition for singly-linked list.
* function ListNode(val) {
* this.val = val;
* this.next = null;
* }
*/
/**
* @param {ListNode} head
* @return {ListNode}
*/
var deleteDuplicates = function(head) {
if (!head || !head.next) return head;
let linkHead = head;
let prev = head;
head.prev = null;
let flag = false;
while (head.next) {
head.next.prev = head;
head = head.next;
if (head.val === prev.val) {
if (!flag) {
flag = true; //打开开关,开始寻找下一个值不同的元素
};
} else {
if (flag) { //找到不同值的元素,修改指针
if (!prev.prev) { //如果重复的是列表头元素
linkHead = head;
head.prev = null;
} else { //如果重复的元素位于列表中间
prev.prev.next = head;
head.prev = prev.prev;
}
flag = false; //关闭开关,继续寻找相同的元素
}
prev = head;
}
}
if (flag) { //如果重复元素段在链表尾部
if (!prev.prev) {
linkHead = null;
} else {
prev.prev.next = null;
}
}
return linkHead;
};