题目
给一个链表,删除所有的重复元素,是每个元素只出现一次,把已排序的链表返回。
分析一波
重复的元素被保留一个(就是删除成没有重复的元素)
思路
因为这是一个升序链表,所以相同值的节点肯定都在一块挨着,
因此:
定义一个节点指向head, 一步一步走,
判断p节点的值是否与p后一个节点的值相等,
如果相等,
那么让p.next=p.next.next(这样原先与p节点值相等的节点就被删除了,只保留值相等的一个节点),
否则,
就让p走一步,p=p.next,
然后继续判断p的值是否与它后一个节点的值相等,
重复上面的操作,直到链表走完。
实践,上代码
var deleteDuplicates = function(head) {
if(!head){
return head;
}
let p=head;
while(p&&p.next){
if(p.val===p.next.val){
q=p.next;
while(q&&(p.val===q.val)){
q=q.next;
}
p.next=q;
}else{
p=p.next;
}
}
return head;
};
判断是否有head,没有就返回;
定义一个p变量赋值为head;
定义一个while循环去走这个链表;
循环里面:
如果p的值等于p的下一个节点的值:
那就就让q等于p的一下一个节点;
里面继续用一个while循环去让q往下移动,如果p的值等于q的值,那么就让q等于q的下一个节点,直到p的值不等于q的值。就是说前后两个值不一样了,就退出里面的循环。
p的下一个节点等于q;
这样中间相等节点就直接删除啦;
否则p值不等于p的下一个节点的值,就让p等于p的下一个节点,就是前后两个值不想等,就不处理,继续让p往后走;
最后返回head;
总结
逻辑原理:
结点值不停的跟下一个结点值对比, 看是否相等,
相等的话, 就把当前结点的next指向next.next结点,也就是下下一个结点,
再把当前结点指向下一个结点,意思就是往下走,然后如此继续去对比.