没有环的链表尾节点会指向空
有环的链表会有一个节点指向链表中以存在的节点
链表如果没有环的话,我们顺着链表的节点一直走下去,一定会遇到空节点。但是如果有环的话,我们一直顺着链表的节点走下去,就会造成死循环,
那我们如何判断链表中是否有环呢?
设置两个指针,一个指针一次走一步,另一个指针一次走两步,如果两个指针相遇的话,那这个链表就是有环的,这个解法时间复杂度,额外空间复杂度
。表示链表中节点个数
下面来证明一下为什么有环的话两个指针一定会相遇,以及一定可以在n次操作之内相遇
当慢指针进入环的入口节点的时候,快指针一定在环内的某个位置,假设快慢指针这时的距离为t。如下图快指针和慢指针之间的距离就是8
然后每一次快指针走两步,慢指针走一步,所以进行一次操作以后,快慢指针之间的距离是t-1,再操作一次是t-2、t-3...直到操作t次以后,快慢指针之间的距离为0,即两个指针相遇,所以,如果链表有环的话,快慢指针一定可以在n次操作以内相遇
c++
class Solution {
public:
bool hasCycle(ListNode *head) {
ListNode* fast = head;
ListNode* slow = head;
while(slow!=NULL&&fast->next!=NULL&&fast->next->next!=NULL)
{
fast = fast->next->next;
slow = slow->next;
if(fast==slow)
{
return true;
}
}
return false;
}
}; java
public class Solution {
public boolean hasCycle(ListNode head) {
ListNode fast = head;
ListNode slow = head;
while(slow!=null&&fast.next!=null&&fast.next.next!=null)
{
fast = fast.next.next;
slow = slow.next;
if(fast==slow)
{
return true;
}
}
return false;
}
}python
class Solution:
def hasCycle(self , head ):
fast = head
slow = head
while slow!=None and fast.next!=None and fast.next.next!=None:
fast = fast.next.next;
slow = slow.next;
if fast==slow:
return True
return False
京公网安备 11010502036488号