删除链表中重复的结点
相似题目:
leetcode-java 删除排序链表中的重复元素–保留一个元素
leetcode-java 删除排序链表中的重复元素II – 不保留重复元素
上面用的方法会多一点,可以从多个角度理解一下
题目描述:
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。
例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
问题分析:
方法一:
直接修改
不保留重复元素,注意设置一个新的头结点
方法二:
遍历放在数组中,去重,链接
放在数组中的方式还有点问题,对于后面的链接还有点问题
代码展示:
/*function ListNode(x){
this.val = x;
this.next = null;
}*/
function deleteDuplication(pHead)
{
// 思路:1,直接在原链表上进行修改
if(!pHead) return null;
let p =new ListNode(-1);
p.next=pHead; //添加虚拟头结点
let pre=p; //代指头结点
let cur=p.next; //当前结点
while(cur){
if(cur.next && cur.val==cur.next.val){
while(cur.next && cur.val==cur.next.val){ //一直找到不同的点
cur=cur.next;
}
pre.next=cur.next;//因为是不保留删除,所以cur要再往下走一个
cur=cur.next; //更新cur为他的下一个
}else{
pre=pre.next;
cur=cur.next;
}
}
return p.next;
//2,新建一个链表,链接插入元素
//3,使用集合,记录最后一个重复值,删除所有值
// if(pHead.next === null)
// return pHead;
// let p = pHead;
// let res = [];
// let tmp;
// let tmp2;
// while(p !== null){
// if(res.indexOf(p.val) > -1){
// tmp = p.val;
// while(p.next && p.val === p.next.val){
// p = p.next;
// }
// tmp = p.val;
// p = p.next;
// }else{
// tmp2 = p.val;
// if( tmp2 !== tmp){
// for(let i=res.length-1;i>=0;i--){
// if(res[i] === tmp){
// res.pop();
// }
// }
// }
// p = p.next;
// }
// }
// let node = new ListNode(-1);
// for(let i=0;i<res.length;i++){
// node.val = res[i];
// node = node.next;
// }
// return node;
}