判断单链表是否带环?若带环,求环的长度?求环的入口点?(C语言)
2016-04-14 20:03
483 查看
PSListNode HasCycle(PSListNode pHead) { if ((NULL == pHead) || (NULL == pHead->pNextNode)) { return NULL; } else { PSListNode pFast = pHead->pNextNode->pNextNode; PSListNode pSlow = pHead->pNextNode; //利用快慢指针,让快指针每次走两步,慢指针每次走一步,要是快指针没有走到NULL,且快指针与慢指针指向相同就说明是有环 while (pFast != pSlow) { //快指针要是没有指向为空,那么慢指针就不可能指向空(快指针走得快) if (NULL == pFast) { return; } else { pFast = pFast->pNextNode; pSlow = pSlow->pNextNode; if (NULL == pFast) { return; } else { pFast = pFast->pNextNode; } } } return pFast; } } int GetCyleLen(PSListNode pMeetNode) { //默认传的参数是HasCycle函数返回的环中的一个结点 if (NULL == pMeetNode) { return 0; } else { int nCount = 1; PSListNode pNode = pMeetNode; while (pMeetNode != pNode->pNextNode) { pNode = pNode->pNextNode; nCount++; } return nCount; } } //pMeetNode参数是用HasCycle函数求链表是否有环时pFast指针与pSlow指针的碰撞点 //定律:在链表头,pFast指针与pSlow指针的碰撞点分别设定一个指针,每次各走一步,两个指针必定相遇,则相遇第一点为环入口点 PSListNode FindEnterNode(PSListNode pHead, PSListNode pMeetNode) { PSListNode pNode = pHead; if ((NULL == pHead) || (NULL == pMeetNode)) { return NULL; } while (pNode != pMeetNode) { pNode = pNode->pNextNode; pMeetNode = pMeetNode->pNextNode; } return pNode; }
相关文章推荐
- 查找单链表的倒数第k个节点,要求只能遍历一次链表(C语言)
- c++第3次作业
- 查找单链表的中间节点,要求只能遍历一次链表(C语言)
- 合并两个有序链表,合并后依然有序(C语言)
- C++中operator的主要用法
- 单链表排序(冒泡排序)(C语言)
- leetcode21题 题解 翻译 C语言版 Python版
- c++ json封装---解析
- c++第二次作业
- ActiveX(MFC)控件——添加接口及WEB调用
- C++ string类的实现
- int、long、long long取值范围
- C++创建文件夹
- VC 字符串转化和分割
- C++打印日志功能设计
- C++基本语法-----template
- 逆置/反转单链表(C语言)
- 单链表实现约瑟夫环(JosephCircle)(C语言)
- 在无头单链表的一个非头节点前插入一个节点(C语言)
- c语言前n项求和如何实现?2个方法可行的