1. 怎样判断一个链表有环
(1)最常用方法
定义两个指针,同时从链表的头节点出发,一个指针一次走一步,另一个指针一次走两步。如果走得快的指针追上了走得慢的指针,那么链表就是环形链表;如果走得快的指针走到了链表的末尾(next指向 NULL)都没有追上第一个指针,那么链表就不是环形链表。
bool IsLoop(NODE *head) {// 假设为带头节点的单链表
if (head == NULL)
return false;
node *slow = head->next; // 初始时,慢指针从头节点开始走1步
if (slow == NULL)
return false;
node *fast = slow->next; // 初始时,快指针从头节点开始走2步
while (fast!=NULL && slow!=NULL){ //当单链表没有环时,循环到链表尾结束
if (fast == slow)
return true;
slow = slow->next; // 慢指针每次走一步
fast = fast->next;
if (fast != NULL)
fast = fast->next;
}
return false;
}
(2)