单链表判断是否带环,环的接入点
2015-07-16 10:19
169 查看
1、是否带环判断:使用追赶的方法,设定两个指针slow、fast,从头指针开始,每次分别前进1步、2步。如存在环,则两者相遇;如不存在环,fast遇到NULL退出。
2、环的接入点:碰撞点p到连接点的距离=头指针到连接点的距离,因此,分别从碰撞点、头指针开始走,相遇的那个点就是连接点。
2、环的接入点:碰撞点p到连接点的距离=头指针到连接点的距离,因此,分别从碰撞点、头指针开始走,相遇的那个点就是连接点。
//判断单链表是否带环 bool FindListTail(PList &head, PList &hNode) { Node *slow, *fast; slow = fast= head; while(fast != NULL&&fast->_next !=NULL) { fast = fast->_next->_next; slow = slow->_next; if(fast == slow) { hNode=fast; return true; } } return false; } //环的接入点 Node *findLoopPort(PList head) { if(head == NULL || head->_next == NULL) return NULL; Node *slow,*fast; slow = fast = head; while(fast != NULL && fast->_next != NULL) { fast = fast->_next->_next; slow = slow->_next; if(fast == slow) break; } if(fast != slow) return NULL; fast = head; while(fast != slow) { fast = fast->_next; slow = slow->_next; } return fast; } //查找节点 Node* Find(PList head, DataType x) { Node* tail = head; while (tail != NULL) { if (x == tail->_data) { return tail; } tail = tail->_next; } cout << "NULL" << endl; return NULL; } //单链表 void Test11() { PList list; list = NULL; PushBack(list, 1); PushBack(list, 2); PushBack(list, 3); PushBack(list, 4); PushBack(list, 5); PushBack(list, 6); PushBack(list, 7); PushBack(list, 8); Node *cur = Find(list,5); Node *lcur= Find(list,8); lcur->_next=cur; Node *hNode = NULL; int ret = FindListTail(list,hNode); cout<<ret<<endl; Node *ret1 = findLoopPort(list); cout<<ret1->_data<<endl; } int main() { Test11(); return 0; }
相关文章推荐
- 软件开发过程
- Android ImageView图片自适应
- 【优先队列】POJ1442-Black Box
- CCNA2.0笔记_ACL
- C#中产生SQL语句的几种方式
- centos 7 安装gamit和GMT
- OpenSSL 编程 - RSA 加密解密
- Unity3D 游戏架构脚本该如何来写
- Unity3d 引擎原理详细介绍
- unity脚本技术框架
- eclipse如何安装babel
- 基于X86 TMDA CSMA的嵌入式研究
- Android 自定义过滤搜索框
- 第3章 结构之法——电话号码对应英语单词
- groupId 和 artifactID 解释
- Spring MVC框架
- 暑假集训大二第一周周三赛 A仙人掌的残影
- InnoDB -- innodb表如何更快得到count(*)结果
- spring3 常见异常解决
- HDU2089 不要62(数位dp)