标签:blog ar io os sp 2014 log bs 代码
如果有两个头结点指针,一个走的快,一个走的慢,那么若干步以后,快的指针总会超过慢的指针一圈。
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; }
标签:blog ar io os sp 2014 log bs 代码
原文地址:http://blog.csdn.net/djb100316878/article/details/41960985