如何解决链表中是否存在链表的问题:
设置两个指针p1, p2,每次p1向前走一步,p2向前走两步,直到p2碰到NULL或两个指针相等时结束循环。
如果两个指针相等,则说明该链表存在环。
程序实现:
//判断链表是否存在环
bool isLoop(ListNode *head) {
ListNode *p1, *p2;
p1 = p2 = head->next;
if(head == NULL || head->next == NULL) {
return false;
}
do{
p1 = p1->next; //p1走一步
p2 = p2->next->next; //p2走两步
}while(p2 && p2->next && p1 != p2);
if(p1 == p2) {
return true;
} else {
return false;
}
}
测试用例:
int main()
{
int pos, data;
ListNode *head, *item, *p, *q;
head = create_list();
cout << endl;
print_list(head);
p = head->next;
if(p != NULL) {
q = p->next;
}
while(q) {
p = p->next;
q = q->next;
}
p->next = head->next;
bool flag = isLoop(head);
cout << "list is loop ? " << flag << endl;
}