环形链表
给定一个链表,判断链表中是否有环。
为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。
运算代码如下:
class Solution
{public: bool hasCycle(ListNode *head)
{if(head==NULL||head->next==NULL)
return false;
ListNode *k=head;//检测节点
ListNode *q=head->next;//遍历节点
int count=0;//记录检测节点走了多少步
while(q)
{ for(int i=count;i>0;i--)
{k=k->next;
if(k==q)
return true; }
k=head;//还原
q=q->next;
count++;
}
return false;
}};
这是穷举法
一个检测指针 k,遍历指针 q,count记录遍历指针q走的步数
遍历指针每走一步,检测指针 k 就走遍历指针 q 之前走过的节点,若发现相同的节点便说明有环
知道遍历节点 q 为 NULL 停止
复杂度分析:
检测节点 k 移动的次数远远大于遍历节点,当链表不存在环时,检测节点的移动次数为 1+2+3+…+n1+2+3+…+n ,计算可以直到时间复杂度为 O(n^2)O(n
2
)。空间复杂度为 O(1)O(1) 。
虽然耗时多,但是内存消耗极少。