Q: 给定一个linked list, 如何判断这个linked list 中是否有一个loop。 例如如下图:
链表的一个节点定义如下:
struct ListNode {
int data;
ListNode *next;
};
分析: 这是一个很有名的面试题。 我们的解法是:
使用两个指针pFast和pSlow, 均初始化为指向链表头。 一个指针一次向前移动1个节点, 另一个指针一次向前移动两个节点。 也就是说pFast指针向前移动到的速度是pSlow的两倍。 如果移动快的pFast指针和移动慢的pSlow指针相遇了, 就表明list中有一个loop, 也就是pFast在转圈圈。 否则, 没有loop的话, 那么pFast 必然移动到list 的尾部。 程序如下:
bool HasLoop(ListNode *pHead) {
if(pHead == NULL)
return false;
ListNode* pSlow = pHead -> next;
if(pSlow == NULL)
return false;
ListNode* pFa