链表中环的入口节点

链表中环的入口结点

http://www.nowcoder.com/questionTerminal/253d2c59ec3e4bc68da16833f79a38e4

双指针解法

前置思想(以下长度指节点数量)
假设环的长度为k,链表长度为n,那么环的入口节点的前面的长度则为n-k。我们可以用两个指针left和right,先让right向前走k步,此时它距离链表终点的长度为n-k。然后我们再让这两个指针同步前进,当他们相遇时,所在节点即为环的入口。

图片说明

  1. 首先利用快慢双指针,判断链表是否存在环(两个节点相遇时即存在环),不存在则立即返回null,否则接着下一步。
  2. 两个节点相遇时是在环里面,因此可以让慢节点静止不动,让快节点从慢节点开始向前移动并计数,当相遇时的计数便是环的长度。
  3. 利用left和right两个指针,left在起始点,让right先走k步,然后两个指针再同步前进,等到相遇时的节点即为环的入口。
public ListNode EntryNodeOfLoop(ListNode pHead)
 {
        if(pHead==null||pHead.next==null)
            return null;
        ListNode slow=pHead,fast=pHead.next.next;
        // check whether the list has circle
        while(slow!=null&&fast.next!=null&&slow!=fast){
            slow=slow.next;
            fast=fast.next.next;
        }
        if(slow==null||fast==null)
            return null;
        // length of circle
        int k=1;
        fast=slow.next;
        while(slow!=fast){
            k++;
            fast=fast.next;
        }
        slow=pHead;
        fast=pHead;
        // move forward k steps
        for(int i=0;i<k;i++){
            fast=fast.next;
        }
        //move forward synchronously
        while(slow!=fast){
            slow=slow.next;
            fast=fast.next;
        }
        return slow;


    }
全部评论

相关推荐

Aaso:挺好的,早挂早超生
点赞 评论 收藏
分享
来个offer吧求求求了:校园经历和要找到工作有半毛钱关系?
点赞 评论 收藏
分享
虚闻松声:很顶的简历,不改也没啥问题。 两点建议 1. 细化项目经历。关于【负责内容】可以稍微再具体一些,重点项目可以写两三个大的模块,以列表形式展开。同时适当提一下项目最终的效果。 2. 适当精炼表达。课程写一行足矣;荣誉奖项,写成一两行吧;CET-6再加一句话就行了,4 没必要写 CV、求职等咨询,欢迎私信交流。
投递中科院自动化所等公司10个岗位 > 听劝,这个简历怎么改
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务