C++ 算法之 是否为环形链表
2014-12-16 15:32
253 查看
如果有两个头结点指针,一个走的快,一个走的慢,那么若干步以后,快的指针总会超过慢的指针一圈。
完整代码测试:
bool IsCycleList(ListNode* pHead) { if(pHead== NULL) return false; if (pHead->m_pNext == NULL) { return false; } ListNode* pFastNode = pHead; ListNode* pSlowNode = pHead; //如果为偶数个,pFastNode->m_pNext->m_pNext为空;如果为奇数个,pFast->m_pNext为空; while(pFastNode->m_pNext != NULL && pFastNode->m_pNext->m_pNext != NULL) { pFastNode = pFastNode->m_pNext->m_pNext; pSlowNode = pSlowNode->m_pNext; if (pSlowNode == pFastNode) { break; } } if (pFastNode == NULL || pFastNode->m_pNext == NULL) { return false; } else { return true; } }
完整代码测试:
// CycleList.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
using namespace std;
struct ListNode
{
int m_nValue;
ListNode* m_pNext;
ListNode(int k):m_nValue(k),m_pNext(NULL)
{
}
};
bool IsCycleList(ListNode* pHead) { if(pHead== NULL) return false; if (pHead->m_pNext == NULL) { return false; } ListNode* pFastNode = pHead; ListNode* pSlowNode = pHead; //如果为偶数个,pFastNode->m_pNext->m_pNext为空;如果为奇数个,pFast->m_pNext为空; while(pFastNode->m_pNext != NULL && pFastNode->m_pNext->m_pNext != NULL) { pFastNode = pFastNode->m_pNext->m_pNext; pSlowNode = pSlowNode->m_pNext; if (pSlowNode == pFastNode) { break; } } if (pFastNode == NULL || pFastNode->m_pNext == NULL) { return false; } else { return true; } }
int _tmain(int argc, _TCHAR* argv[])
{
ListNode* head = new ListNode(1);
ListNode* Node1 = new ListNode(2);
ListNode* Node2 = new ListNode(3);
ListNode* Node3 = new ListNode(4);
ListNode* Node4 = new ListNode(5);
ListNode* Node5 = new ListNode(6);
ListNode* Node6 = new ListNode(7);
head->m_pNext = Node1;
Node1->m_pNext = Node2;
Node2->m_pNext = Node3;
Node3->m_pNext = Node4;
Node4->m_pNext = Node5;
Node5->m_pNext = Node6;
Node6->m_pNext = head;
bool b = IsCycleList(head);
cout<<b<<endl;
getchar();
return 0;
}
相关文章推荐
- 转:C/C++面试之算法系列--怎样快速检测出一个巨大的单链表中是否具备死链及其位置
- C/C++面试之算法系列--怎样快速检测出一个巨大的单链表中是否具备死链及其位置
- 面试题四 C/C++面试秘笈 之判断链表是否存在环形链表问题-程序员面试题
- C/C++面试之算法系列--怎样快速检测出一个巨大的单链表中是否具备死链及其位置
- [C++学习笔记] 链表应用1判断一个集和是否为另一个集合的子集
- 双向循环链表删除算法的C++程序实现
- 每天学习一算法系列(8) (编程判断俩个链表是否相交)
- 一道不错的算法题-判断链表是否有环
- 双向循环链表插入算法的C++程序实现
- 和链表有关的算法题(C++)
- 每天一算法(判断两个单向链表是否相交)
- C++类模板 实现双向循环链表的基本算法 《数据结构》(C++版 北京科海)中摘抄
- 笔试算法题(25):复制拥有多个指针的链表 & 判断二元树B是否为A的子树
- 判断一个单向链表是否有环,算法证明
- 算法习题8:判断俩个链表是否相交
- 检查一个二叉树是否平衡的算法分析与C++实现
- 实现一个简单的c++ list容器(含sort排序 链表归并算法实现)
- C/C++面试之算法系列--一次遍历找链表倒数第n个节点
- 算法题006 判断两个链表是否相交
- 算法:判断一个链表中是否有环