题目描述
给出一个升序排序的链表,删除链表中的所有重复出现的元素,只保留原链表中只出现一次的元素。
例如:
给出的链表为1→2→3→3→4→4→5, 返回1→2→5.
给出的链表为1→1→1→2→3, 返回2→3.
数据范围:链表长度 0≤n≤10000,链表中的值满足 ∣val∣≤1000
要求:空间复杂度O(n),时间复杂度O(n)
进阶:空间复杂度O(1),时间复杂度O(n)
解题思路
判断链表是否为空,或链表只有一个元素,声明一个新节点newHead指向链表头部,令prev指针指向该节点,current指向head。判断当前节点的下一节点和当前节点元素内容是否相同,直到遇到不相同的元素,当前元素的next指向该不相同元素
代码
/*
* function ListNode(x){
* this.val = x;
* this.next = null;
* }
*/
/**
*
* @param head ListNode类
* @return ListNode类
*/
function deleteDuplicates( head ) {
// 判断链表是否为空,或链表只有一个元素
if(!head || !head.next) return head;
// 声明一个新节点newHead指向链表头部,没有节点指向头部的话,第一个节点重复就无法删除
let newHead = new ListNode(-1);
newHead.next = head;
let current = head;
let prev = newHead;
//判断当前节点的下一节点和当前元素内容是否相同,直到遇到不相同的元素,当前元素的next指向该不相同元素
while (current&¤t.next) {
if(current.val === current.next.val){
while(current.val === current.next.val) {
current.next = current.next.next;
if(!current.next){
break;
}
}
prev.next = current.next;
current = prev.next;
}else {
prev = current;
current = current.next;
}
}
return newHead.next;
//返回newHead.next
}
module.exports = {
deleteDuplicates : deleteDuplicates
};