链表

1、找出链表中环的入口结点
思路1:用map记录走过的节点,当 当前节点是走过的,则为入口
思路2:快慢指针

设置快慢指针,都从链表头出发,快指针每次走两步,慢指针一次走一步,假如有环,一定相遇于环中某点(结论1)。---找相遇点
接着让两个指针分别从相遇点和链表头出发,两者都改为每次走一步,最终相遇于环入口(结论2)。---分别从相遇点和链表头出发

import java.util.*;
public class Solution {
    public ListNode EntryNodeOfLoop(ListNode pHead)
    {
        ListNode q=pHead;
        ListNode s=pHead;
        while(q!=null&&q.next!=null){
            //放前面,因为q、s初始是一样的,而环不可能只有一个节点,放弃对第一个节点的环判断
            q=q.next.next;
            s=s.next;
            if(q==s){//有相遇点q,即有环
               q=pHead;
               while(q!=s){
                   q=q.next;
                   s=s.next;
               }//此时q==s,再次相遇于入环点
               return q;
            }
        }
        return null;
    }
}

2、删除链表中重复的结点
删除链表节点时,一定要保留 前一个节点最未被删除的节点/其下一个
所以要有两个指针,一个指向被判断节点的前一个(l),一个指向被判断节点的下一个(r)。
由于第一个节点也可能被删除,所以要在最前面建立一个空白节点,作为l。

public class Solution {
    public ListNode deleteDuplication(ListNode pHead)
    {
        //头尾指针
        if(pHead==null) return null;
        ListNode h=new ListNode(0);
        h.next=pHead;
        ListNode l=h;//l是目标节点的前一个
        ListNode r=null;
        while(l.next!=null&&l.next.next!=null){
            r=l.next.next;
            if(r.val==l.next.val){
                while(r!=null&&r.val==l.next.val){
                    r=r.next;
                }//r到了连续相同中的最后一个节点
                l.next=r;//现在被比较的是 连续相同中的后一个
            }
            else
                l=l.next;
        }
        return h.next;
    }
}
全部评论

相关推荐

整顿职场的柯基很威猛:这种不可怕,最可怕的是夹在一帮名校里的二本选手,人家才是最稳的。
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务