求带环的单链表入口位置处的节点
来源:互联网 发布:淘宝永久封店不能购物 编辑:程序博客网 时间:2024/05/16 00:31
题目:如本文题目,给定一个带环的单链表,给出一个算法求链表环的入口位置处的节点。解析:这题的解决步骤如下:1.设置一个快指针fast和一个慢指针slow,它们同时从链表头开始往后遍历,快指针每次移动两个位置,慢指针每次移动一个位置2.当快指针和慢指针相遇时,将慢指针重新指向链表头3.快指针和慢指针此时在同时移动,两个指针都一次移动一个位置,当两个指针再次相遇时,指针所指的节点即入口节点。之所以这样能够定位环的入口节点,原因解析如下:假设链表头节点为head,环入口节点为entrance,并假设有head到entrance共有n个节点(包括head,但不包括entrance),环的节点个数为m。我们知道,快指针和慢指针第一次相遇的节点肯定在环中,假设从entrance到这个节点共k个节点(包括entrance和相遇的节点)。那么此时slow指针共移动了 n+k 个节点,fast指针共移动了 2*(n+k) 个节点。则有 2*(n+k) = n + k + x*m,其中x表示此时fast指针已经在环中绕的圈数。由此可以得到 n+k=x*m,即 n = (x-1)*m + m - k。那么此时再将慢指针重新指向head,并且slow指针和fast指针均以同样的速度,每次移动一个节点位置往后移动,那么当slow指针走到entrance时,fast指针同样移动到了entrance节点。代码如下:SListNode* FindBeginning(SListNode* head){if (head == NULL){return NULL;}SListNode* fast = head;SListNode* slow = head;while (1){fast = fast->next->next;slow = slow->next;if (fast == slow){break;}}slow = head;while (fast != slow){fast = fast->next;slow = slow->next;}return fast;}测试用例如下:void Test14(){SListNode *seq = NULL;PushBack(seq, 1);PushBack(seq, 2);PushBack(seq, 3);PushBack(seq, 4);PushBack(seq, 5);PushBack(seq, 6);PushBack(seq, 7);PushBack(seq, 8);PushBack(seq, 9);PushBack(seq, 10);SListNode * address1 = Find(seq, 10); //将节点10的地址返回给address1SListNode * address2 = Find(seq, 6); //将节点6的地址返回给address2address1->next = address2; //节点10就会指向节点6,这样就形成一个环SListNode* ret=FindBeginning(seq); //利用函数返回环入口节点地址给retcout << "入口节点是 "<<ret->date << endl; //输出环入口节点的数据}运行结果如下:
本文出自 “零点时光” 博客,请务必保留此出处http://10741764.blog.51cto.com/10731764/1747533
0 0
- 求带环的单链表入口位置处的节点
- 寻找带环的单链表的换的入口位置处的节点
- 求带环单链表的入口点
- 判断单链表是否带环,环的入口位置?
- 判断单链表是否带环,若带环,求环的长度,求环的入口点
- 判断单链表是否带环? 若带环, 求环的长度? 求环的入口点?
- 判断单链表是否带环? 若带环, 求环的长度? 求环的入口点?
- 判断单链表是否带环?若带环,求环的长度?求环的入口点?
- 判断单链表是否带环?若带环,求环的长度?求环的入口点?
- 判断单链表是否带环?若带环,求环的长度,求环的入口点
- 判断单链表是否带环?若带环,求环的入口点?
- 判断单链表是否带环,如果带环,求环的长度和入口结点
- 判断单链表是否带环?若带环,求环的长度?求环的入口点?(C语言)
- 如何找到带环链表的入口节点?
- 判断链表是否带环?若带环求环的长度?求环的入口点?
- 求带环链表的入口的多种解法
- 链表面试题----判断一个单链表是否带环,若带环,求入口点和环的长度
- 带环单链表的环入口点
- Leetcode no. 212
- MySQL 主从同步错误解决
- Linux 常用命令集合
- java 加密技术(二)
- 关于深拷贝和浅拷贝
- 求带环的单链表入口位置处的节点
- WebService笔记(三):SOAP
- 双向链表中基本函数的实现
- 微信网页授权流程总结
- 盘吃蛇
- 线索化二叉树
- 哈希表
- 迷宫的实现
- c++统计程序运行时间的方法