删除排序链表中的重复元素 II
题目描述:
存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除链表中所有存在数字重复情况的节点,只保留原始链表中 没有重复出现 的数字。
返回同样按升序排列的结果链表。
链接:
82. 删除排序链表中的重复元素 II - 力扣(LeetCode) (leetcode-cn.com)
解题思路
思路一:遍历
额外使用一个哑节点指向链表的头节点,
指针 cur 指向链表的哑节点,随后开始对链表进行遍历。如果当前 cur.next 与 cur.next.next 对应的元素相同,那么我们就需要将 cur.next 以及所有后面拥有相同元素值的链表节点全部删除。我们记下这个元素值 x,随后不断将 cur.next 从链表中移除,直到 cur.next 为空节点或者其元素值不等于 x 为止。此时,我们将链表中所有元素值为 xx 的节点全部删除。
如果当前cur.next 与 cur.next.next 对应的元素不相同,那么说明链表中只有一个元素值为 cur.next 的节点,那么我们就可以将 cur 指向 cur.next。
当遍历完整个链表之后,我们返回链表的的哑节点的下一个节点 dummy.next 即可。
/**
* @param {ListNode} head
* @return {ListNode}
*/
var deleteDuplicates = function (head) {
var dummy = new ListNode(0, head);
dummy.next = head;
var cur = dummy;
// 边界判断
while (cur.next && cur.next.next) {
if (cur.next.val === cur.next.next.val) {
const x = cur.next.val;
// 将 cur.next 以及所有后面拥有相同元素值的链表节点全部删除
while (cur.next && cur.next.val === x) {
cur.next = cur.next.next;
}
} else {
cur = cur.next;
}
}
return dummy.next;
};
时间复杂度: O(n)
空间复杂度: O(1)