如何判断链表有环并判断环的入口节点

如何判断链表有环

设置快慢指针,两个指针都从头节点开始,快指针一次走两步,慢指针一次走一步,如果快慢指针相遇则链表有环。

伪代码:node *fast=head; node *slow=head; while(fast!=NULL&&fast->next!=NULL) { fast=fast->next->next; slow=slow->next; if(fast==slow) return true; }

如何判断环的入口节点

上面判断完有环后,将快指针指向表头,然后和慢指针一起继续走,快慢指针此时一次都只走一步,下一次快慢指针相遇的节点即为入口节点。

伪代码:fast=head; while(fast!=slow) { fast=fast->next; slow=slow->next; } return fast;

分析:快慢指针第一次相遇,慢指针走了n步,快指针走了2n步,快指针比慢指针多走了一个环,所以环的长度为n,假设整个链表长度为x,那么慢指针还剩下x-n步就走到了环的入口节点,x-n正好也为整个链表除了环的部分外其余部分的长度,所以此时快指针从头开始走到环的入口节点也需要x-n步,所以此时将快指针指向表头,然后和慢指针一起继续走,快慢指针此时一次都只走一步,下一次快慢指针相遇的节点即为入口节点。

经验分享 程序员 微信小程序 职场和发展