题目
给定一个链表的头节点 head ,判断链表中是否有环。如果链表中存在环,则返回 true 。 否则,返回 false 。
如下图为一个循环链表示意图:
输入:head = [3,2,0,-4]
输出:true
解释:链表中有一个环,其尾部连接到第二个节点。
解决思路
快慢指针追逐法:
- 定义一个快指针和一个慢指针。
- 慢指针指向head节点(链表的第一个节点),快指针指向head的下一个节点。
- 快指针每次走2步,慢指针每次走1步。
- 如果快慢指针在链表中的某个节点相遇,则说明链表中存在环。
代码
- C++代码:
#include <stdio.h>
#include <windows.h>
// definition for singly-linked list
struct ListNode {
int val;
ListNode *next;
ListNode(int x): val(x), next(NULL) {}
};
class Solution {
public:
bool hasCycle(ListNode *head) {
if (nullptr == head) {
return head;
}
ListNode *slow = head;
ListNode *quick = head->next;
while (slow != quick && quick && quick->next) {
slow = slow->next;
quick = quick->next->next;
}
return slow == quick;
}
};
int main()
{
// create a cycle list
ListNode *a = new ListNode(3);
ListNode *b = new ListNode(2);
ListNode *c = new ListNode(0);
ListNode *d = new ListNode(-4);
a->next = b;
b->next = c;
c->next = d;
d->next = b;
ListNode *head = a;
// check if has a cycle
Solution *solution = new Solution();
if (solution->hasCycle(head)) {
printf("has cycle\n");
} else {
printf("do not has cycle\n");
}
system("pause");
return 0;
}
- python3代码
# -*- coding: utf-8 -*-
# define for singly-linked list
class ListNode:
def __init__(self, x):
self.value = x
self.next = None
class Solution:
def hasCycle(self, head: ListNode):
if not head:
return head
slow, quick = head, head.next
while slow != quick and quick and quick.next:
slow = slow.next
quick = quick.next.next
return slow == quick
def main():
# create a cycle list
a = ListNode(3)
b = ListNode(2)
c = ListNode(0)
d = ListNode(-4)
a.next = b
b.next = c
c.next = d
d.next = b
head = a
# check if has a cycle
solution = Solution()
print('result: ', solution.hasCycle(head))
if __name__ == "__main__":
main()
说明
- 对应LeetCode第141题。
- 链接:https://leetcode-cn.com/problems/linked-list-cycle/submissions/