141. 环形链表
1.快慢指针
-
还有同样应用快慢指针的场景,可以一起完成:
-
移除元素:26. 删除有序数组中的重复项
-
判断链表中是否有环:141. 环形链表
题解:141. 环形链表题解
-
判断链表是否是回文链表:234. 回文链表
-
移除元素:27. 移除元素
-
-
判断链表中是否有环,是快慢指针思想最为经典的应用。
-
我们从不了解这种方法开始,试着分析一下判断链表是否有环的问题:
- 如果链表中有环,从头节点开始遍历,永远走不到NULL,如果没有环,总是能走到NULL;
- 但如果我们通过寻找NULL来判断是否有环,是一种难以控制的方法,因为无法知道链表长度,不知道什么时候该停下来遍历。
-
那我们如果有两个指针呢?并且这两个指针每次遍历前进的步数,一个大,一个小,这就是我们说的快慢指针。这种结构其实也十分简单:
- 如果没有环,快指针一定会走到NULL;
- 如果有环,快慢指针都总会走进环里,好像在操场上有跑的快、跑得慢的两个人,快的那个人总能追上跑的慢的。如果两人相遇了,我们就能说链表有环。
class Solution { public: bool hasCycle(ListNode *head) { if(head==NULL||head->next==NULL){ return false; } ListNode *slow=head; ListNode *fast=head->next; while(slow!=fast){ if(fast==NULL||fast->next==NULL){ return false; } slow=slow->next; fast=fast->next->next; } return true; } };