您的位置:首页 > 其它

LeetCode-Easy部分标签为LinkedList 141 Linked List Cycle

2017-04-04 11:06 531 查看

原题

Given a linked list, determine if it has a cycle in it.

题目分析

判断单链表中是否有环路。

关于单链表中是否有环的概念,请大家自行查询。我由于未找到权威定义,暂时不放到这里。

代码实现

public bool HasCycle(ListNode head)
{
if (head == null) return false;
if (head.next == null) return false;
if (head.next.next == null) return false;

ListNode slow = head;
ListNode fast = head;

while (fast != null && fast.next != null)
{
slow = slow.next;
fast = fast.next.next;
if (fast == null)
return false; //快指针如果为null,不存在环
if (fast.val == slow.val)
{
return true; //找到节点数据域相等点,存在环
}
}
return false;
}


附引用参考网址:

http://www.cnblogs.com/xudong-bupt/p/3667729.html

求有环单链表中的环长、环起点、链表长

判断单链表是否有环

  使用两个slow, fast指针从头开始扫描链表。指针slow 每次走1步,指针fast每次走2步。如果存在环,则指针slow、fast会相遇;如果不存在环,指针fast遇到NULL退出。

  就是所谓的追击相遇问题:

    


求有环单链表的环长

  在环上相遇后,记录第一次相遇点为Pos,之后指针slow继续每次走1步,fast每次走2步。在下次相遇的时候fast比slow正好又多走了一圈,也就是多走的距离等于环长。

  设从第一次相遇到第二次相遇,设slow走了len步,则fast走了2*len步,相遇时多走了一圈:

    环长=2*len-len。

求有环单链表的环连接点位置

  第一次碰撞点Pos到连接点Join的距离=头指针到连接点Join的距离,因此,分别从第一次碰撞点Pos、头指针head开始走,相遇的那个点就是连接点。

    


  在环上相遇后,记录第一次相遇点为Pos,连接点为Join,假设头结点到连接点的长度为LenA,连接点到第一次相遇点的长度为x,环长为R。

    第一次相遇时,slow走的长度 S = LenA + x;

    第一次相遇时,fast走的长度 2S = LenA + n*R + x;

    所以可以知道,LenA + x = n*R;  LenA = n*R -x;

求有环单链表的链表长

  上述2中求出了环的长度;3中求出了连接点的位置,就可以求出头结点到连接点的长度。两者相加就是链表的长度。



  

LinkedList 更多题目

Easy部分标签为LinkedList 的所有题目
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: