剑指offer 有环链表
2017-11-21 09:21
274 查看
链表带环的情况下就需要活用指针:
两个指针的组合可以很好的遍历结点
两个指针的行走速度有差异即可进行环的相关判断(一步、两步、先走后走)
链表每走一步都要注意下一个节点为nullptr时,是否会影响到程序的鲁棒性,造成程序的崩溃,走两步的指针更需要注意这个问题,需要判断两次!(否则为nullptr也就不会再走下去)
两个指针的组合可以很好的遍历结点
两个指针的行走速度有差异即可进行环的相关判断(一步、两步、先走后走)
链表每走一步都要注意下一个节点为nullptr时,是否会影响到程序的鲁棒性,造成程序的崩溃,走两步的指针更需要注意这个问题,需要判断两次!(否则为nullptr也就不会再走下去)
#include <iostream> #include <string> #include <vector> #include <stack> using namespace std; typedef int datatype; struct Node { datatype value; Node* Next_Node; }; struct Node_circle { unsigned int Number; Node *entrace; }; //判断链表中是否有环 Node* Exist_circle(Node *first) { if (first == nullptr || first->Next_Node == nullptr) { return nullptr; } Node* Node_temp1 = first->Next_Node; Node* Node_temp2 = Node_temp1->Next_Node; while (Node_temp2 != nullptr && Node_temp1 != nullptr) { Node_temp1 = Node_temp1->Next_Node; Node_temp2 = Node_temp2->Next_Node; //在链表中,每一个节点为nullptr时是否影响到程序的鲁棒性,造成程序崩溃,都必须考虑在内 if (Node_temp2->Next_Node != nullptr) { Node_temp2 = Node_temp2->Next_Node; } if (Node_temp1 == Node_temp2) { return Node_temp1; break; } } return nullptr; } //输出环中结点的个数以及环的入口 Node_circle* Find_circle(Node *first) { Node* Node_temp5 = Exist_circle(first); if (Node_temp5 == nullptr) { return nullptr; } int number = 1; //已存在环,无需判断下一个节点是否为nullptr了 Node* Node_temp3 = Node_temp5->Next_Node; while (Node_temp3 != Node_temp5) { Node_temp3 = Node_temp3->Next_Node; number++; } Node* entrace = first; for (int i = 0;i<number;i++) { entrace = entrace->Next_Node; } Node* Node_temp4 = first; while (Node_temp4 != entrace) { Node_temp4 = Node_temp4->Next_Node; entrace = entrace->Next_Node; } Node_circle* circle_Node; circle_Node->Number = number; circle_Node->entrace = entrace; return circle_Node; } void main() { system("pause"); }
相关文章推荐
- 剑指offer之从头到尾打印链表
- 【剑指offer】链表相关-合并两个有序链表&递归写法17
- 【剑指Offer】面试题13:在O(1)时间删除链表结点
- 剑指offer--面试题13:在O(1)时间删除链表结点
- 剑指offer 面试题17: 合并两个排序的链表 题解
- 剑指offer--链表中倒数第k个结点
- 【剑指Offer面试编程题】题目1524:复杂链表的复制--九度OJ
- 链表中倒数第k个结点[剑指offer]之python实现
- 反转链表[剑指offer]之python实现
- 剑指offer题15_链表中倒数第k个结点
- 合并两个排序的链表[剑指offer]之python实现
- 7.剑指offer-链表中环的入口节点
- 剑指offer(12)-反转链表
- 【剑指offer-Java版】05从尾到头打印链表
- 《苦练算法》-剑指Offer- 十五、 反转链表 -python编写
- 剑指offer--链表倒数第K个节点
- [剑指offer]面试题16:反转链表
- 剑指offer-15:单链表有趣问题-有环-环长度-环入口等(续)
- 剑指offer(java代码)——从尾到头打印链表
- 剑指offer 两个链表的第一个公共结点