宜春做网站公司,wordpress p=,h5网站开发总结,吉安市网站制作面试经典算法8-环形链表
LeetCode.141 公众号#xff1a;阿Q技术站
问题描述
给你一个链表的头节点 head #xff0c;判断链表中是否有环。
如果链表中有某个节点#xff0c;可以通过连续跟踪 next 指针再次到达#xff0c;则链表中存在环。 为了表示给定链表中的环阿Q技术站
问题描述
给你一个链表的头节点 head 判断链表中是否有环。
如果链表中有某个节点可以通过连续跟踪 next 指针再次到达则链表中存在环。 为了表示给定链表中的环评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置索引从 0 开始。注意pos 不作为参数进行传递 。仅仅是为了标识链表的实际情况。
如果链表中存在环 则返回 true 。 否则返回 false 。
示例 1 输入head [3,2,0,-4], pos 1
输出true
解释链表中有一个环其尾部连接到第二个节点。示例 2 输入head [1,2], pos 0
输出true
解释链表中有一个环其尾部连接到第一个节点。示例 3 输入head [1], pos -1
输出false
解释链表中没有环。提示
链表中节点的数目范围是 [0, 104]-105 Node.val 105pos 为 -1 或者链表中的一个 有效索引 。
**进阶**你能用 O(1)即常量内存解决此问题吗
思路
定义两个指针 slow 和 fast初始时都指向链表的头节点 head。slow 每次向后移动一个节点fast 每次向后移动两个节点。这样如果链表中有环fast 最终会追上 slow。如果 fast 为 nullptr 或者 fast-next 为 nullptr则说明链表中不存在环返回 false。如果 fast 和 slow 相遇则说明链表中存在环返回 true。
图解
这里根据示例1给大家做一个图解演示。
初始化定义两个指针 slow 和 fast初始时都指向链表的头节点 head。 slow 每次向后移动一个节点fast 每次向后移动两个节点。 继续移动 继续移动 此时 fast 和 slow 相遇说明链表中存在环返回true。
如果 fast 为 nullptr 或者 fast-next 为 nullptr则说明链表中不存在环返回 false。
参考代码
C
#include iostream// 定义链表节点结构
struct ListNode {int val;ListNode *next;ListNode(int x) : val(x), next(nullptr) {}
};class Solution {
public:bool hasCycle(ListNode *head) {// 定义快慢指针并初始化为链表头节点ListNode *slow head;ListNode *fast head;// 使用快慢指针判断链表中是否存在环while (fast ! nullptr fast-next ! nullptr) {slow slow-next; // 慢指针每次移动一步fast fast-next-next; // 快指针每次移动两步if (slow fast) { // 如果快慢指针相遇说明存在环return true;}}// 如果快指针到达链表尾部说明不存在环return false;}
};int main() {// 创建一个有环的链表ListNode *head new ListNode(3);head-next new ListNode(2);head-next-next new ListNode(0);head-next-next-next new ListNode(-4);head-next-next-next-next head-next; // 尾节点连接到第二个节点形成环Solution sol;std::cout std::boolalpha sol.hasCycle(head) std::endl; // 输出 true表示链表中存在环// 释放链表内存ListNode *curr head;while (curr ! nullptr) {ListNode *temp curr;curr curr-next;delete temp;}return 0;
}Java
class ListNode {int val;ListNode next;ListNode(int x) {val x;next null;}
}public class Solution {public boolean hasCycle(ListNode head) {// 定义快慢指针并初始化为链表头节点ListNode slow head;ListNode fast head;// 使用快慢指针判断链表中是否存在环while (fast ! null fast.next ! null) {slow slow.next; // 慢指针每次移动一步fast fast.next.next; // 快指针每次移动两步if (slow fast) { // 如果快慢指针相遇说明存在环return true;}}// 如果快指针到达链表尾部说明不存在环return false;}
}public class Main {public static void main(String[] args) {// 创建一个有环的链表ListNode head new ListNode(3);head.next new ListNode(2);head.next.next new ListNode(0);head.next.next.next new ListNode(-4);head.next.next.next.next head.next; // 尾节点连接到第二个节点形成环Solution sol new Solution();System.out.println(sol.hasCycle(head)); // 输出 true表示链表中存在环}
}Python
class ListNode:def __init__(self, x):self.val xself.next Noneclass Solution:def hasCycle(self, head: ListNode) - bool:# 定义快慢指针并初始化为链表头节点slow headfast head# 使用快慢指针判断链表中是否存在环while fast and fast.next:slow slow.next # 慢指针每次移动一步fast fast.next.next # 快指针每次移动两步if slow fast: # 如果快慢指针相遇说明存在环return True# 如果快指针到达链表尾部说明不存在环return False# 创建一个有环的链表
head ListNode(3)
head.next ListNode(2)
head.next.next ListNode(0)
head.next.next.next ListNode(-4)
head.next.next.next.next head.next # 尾节点连接到第二个节点形成环sol Solution()
print(sol.hasCycle(head)) # 输出 True表示链表中存在环