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 的所有题目相关文章推荐
- LeetCode-Easy部分中标签为LinkedList 21. Merge Two Sorted Lists
- LeetCode-Easy部分标签为LinkedList 83. Remove Duplicates from Sorted List
- LeetCode-Easy部分标签为LinkedList 237. Delete Node in a Linked List
- LeetCode-Easy部分标签为LinkedList 206. Reverse Linked List
- LeetCode-Easy部分中标签为LinkedList 203 Remove Linked List Elements
- LeetCode-Easy部分标签为LinkedList 234. Palindrome Linked List
- 【Leetcode-Easy-141】Linked List Cycle
- Leetcode[141]-Linked List Cycle
- LeetCode(141)(142) Linked List Cycle I II
- 【leetcode】141/142Linked List Cycle(Floyd判圈算法)
- LeetCode 141 Linked List Cycle(循环链表)(hash / set)
- LeetCode 141: Linked List Cycle
- leetcode 141 Linked List Cycle C++
- [leetcode 141] Linked List Cycle
- LeetCode刷题(C++)——Linked List Cycle(Easy)
- LeetCode: Linked List Cycle [141]
- leetcode 141 —— Linked List Cycle
- leetcode(141):Linked List Cycle
- [LeetCode-141] Linked List Cycle(判断链表是否有环)
- LeetCode 141 Linked List Cycle