算法_删除升序链表中的重复节点I (#83)

73 阅读2分钟

题目

给一个链表,删除所有的重复元素,是每个元素只出现一次,把已排序的链表返回。

image.png

分析一波

重复的元素被保留一个(就是删除成没有重复的元素)

思路

因为这是一个升序链表,所以相同值的节点肯定都在一块挨着,
因此:   定义一个节点指向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结点,也就是下下一个结点,
再把当前结点指向下一个结点,意思就是往下走,然后如此继续去对比.