判断仅有指针域的单链表是否有环且怎么找到环
2013-03-30 19:03
190 查看
链表结构如下:
思路是:
1.设两个指针p和q,p每次移动两个节点(如果没有走到结尾),q每次移动一个节点,如果没有环p会走到最后即p=null,如果有环的话,由于p走的块,q走的慢,p在之后的某个时候会赶上q即p=q
时间复杂度有环时为O(n+k)(k为环包含节点数的一半),没有环时时间复杂度为O(n),最后时间复杂度为O(n)
空间复杂度为O(1)
找到环的入口点
当fast若与slow相遇时,slow肯定没有走遍历完链表,而fast已经在环内循环了n圈(1<=n)。假设slow走了s步,则fast走了2s步(fast步数还等于s 加上在环上多转的n圈),设环长为r,则:
2s = s + nr
s= nr
设整个链表长L,入口环与相遇点距离为x,起点到环入口点的距离为a。
a + x = nr
a + x = (n – 1)r +r = (n-1)r + L - a
a = (n-1)r + (L – a – x)
(L – a – x)为相遇点到环入口点的距离,由此可知,从链表头到环入口点等于(n-1)循环内环+相遇点到环入口点,于是我们从链表头、与相遇点分别设一个指针,每次各走一步,两个指针必定相遇,且相遇第一点为环入口点。
程序描述如下:
struct ListNode { struct ListNode *next; };
思路是:
1.设两个指针p和q,p每次移动两个节点(如果没有走到结尾),q每次移动一个节点,如果没有环p会走到最后即p=null,如果有环的话,由于p走的块,q走的慢,p在之后的某个时候会赶上q即p=q
时间复杂度有环时为O(n+k)(k为环包含节点数的一半),没有环时时间复杂度为O(n),最后时间复杂度为O(n)
空间复杂度为O(1)
bool IsExitsLoop(slist *head) { slist *slow = head, *fast = head; while ( fast && fast->next ) { slow = slow->next; fast = fast->next->next; if ( slow == fast ) break; } return !(fast == NULL || fast->next == NULL); }
找到环的入口点
当fast若与slow相遇时,slow肯定没有走遍历完链表,而fast已经在环内循环了n圈(1<=n)。假设slow走了s步,则fast走了2s步(fast步数还等于s 加上在环上多转的n圈),设环长为r,则:
2s = s + nr
s= nr
设整个链表长L,入口环与相遇点距离为x,起点到环入口点的距离为a。
a + x = nr
a + x = (n – 1)r +r = (n-1)r + L - a
a = (n-1)r + (L – a – x)
(L – a – x)为相遇点到环入口点的距离,由此可知,从链表头到环入口点等于(n-1)循环内环+相遇点到环入口点,于是我们从链表头、与相遇点分别设一个指针,每次各走一步,两个指针必定相遇,且相遇第一点为环入口点。
程序描述如下:
slist* FindLoopPort(slist *head) { slist *slow = head, *fast = head; while ( fast && fast->next ) { slow = slow->next; fast = fast->next->next; if ( slow == fast ) break; } if (fast == NULL || fast->next == NULL) return NULL; slow = head; while (slow != fast) { slow = slow->next; fast = fast->next; } return slow; }
相关文章推荐
- 判断仅有指针域的单链表是否有环且怎么找到环
- 用快慢指针判断单链表环,找到环入口 扩展到判断两个链表是否相交
- 如何判断一个链表是否有环? 2、如果链表为存在环,如果找到环的入口点?
- 20140719 找到单链表的倒数第K个节点 判断一个链表是否成为一个环形 反转
- 怎么判断链表中是否有环?
- 怎么判断链表中是否有环?
- 怎么判断链表中是否有环
- 给出两个单向链表的头指针,比如h1、h2, 判断链表是否相交
- 判断链表是否有环 、 找到环的入口节点
- 判断链表是否带环,若带环,找到环的入口点
- 判断单链表是否为循环链表-----在有序链表中寻找中位数------使用快慢指针
- 如何判断单链表是否有环,如果有怎么找到进入环的节点
- 判断单链表是否有环并找到入口处以及判断两个单向链表是否相交
- 判断两链表是否相交,如果相交找到第一个交点
- 题目:①判断一个单向链表是否有环,如果有环则找到环的入口节点。 ②判断两个单向链表是否相交,如果相交则找到交点节点。
- 每天一道LeetCode-----判断链表是否有环,如果有,找到环的入口位置
- 链表怎么判断是否相交
- 转:判断两个单向链表是否相交,并找到两个单向链表的第一个相交节点
- 【算法分析】如何理解快慢指针?判断linked list中是否有环、找到环的起始节点位置。以Leetcode 141. Linked List Cycle, 142. Linked List Cycle II 为例Python实现
- 判断链表是否有环为什么快慢指针一定会相遇