Linked List Cycle 判断一个链表是否存在回路(循环)

Given a linked list, determine if it has a cycle in it.

Follow up:
Can you solve it without using extra space?

注意,链表循环并不是尾指针和头指针相同,可能是在中间某一段形成一个环路,所以不能只判断元素和第一个元素是否存在重合

先设置两个指针p_fast和p_slow。从头开始遍历链表,p_fast每次走两个节点,而p_slow每次走一个节点,若存在循环,这两个指针必定重合:

 1 /**
 2  * Definition for singly-linked list.
 3  * struct ListNode {
 4  *     int val;
 5  *     ListNode *next;
 6  *     ListNode(int x) : val(x), next(NULL) {}
 7  * };
 8  */
 9 class Solution {
10 public:
11     bool hasCycle(ListNode *head) {
12         if(head == NULL) return false;
13
14         ListNode *p_fast = head;
15         ListNode *p_slow = head;
16
17         do{
18             p_slow = p_slow->next;
19             if(p_fast != NULL)
20                 p_fast = p_fast->next;
21             if(p_fast != NULL)
22                 p_fast = p_fast->next;
23             else
24                 return false;
25         }while(p_fast != p_slow);
26
27         return true;
28
29     }
30 };
时间: 2024-10-28 14:30:54

Linked List Cycle 判断一个链表是否存在回路(循环)的相关文章

LeetCode (27) Linked List Cycle (判断cycle存在、寻找cycle入口节点)

判断cycle存在 Given a linked list, determine if it has a cycle in it. Follow up: Can you solve it without using extra space? 本题要求判断给定链表中是否存在循环.并且题目要求不要使用extra space,因此,我们就不能保存每一个结点的value,在遍历的时候判断是否是循环.这道题可以通过使用速度不同的pointer进行遍历,若两个pointer相遇则说明存在cycle,若遇到N

[LeetCode]93. Linked List Cycle II查找链表中环的起始节点

Given a linked list, return the node where the cycle begins. If there is no cycle, return null. Note: Do not modify the linked list. Follow up:Can you solve it without using extra space? Subscribe to see which companies asked this question 解法:这道题是题目L

[leetcode]141. Linked List Cycle判断链表是否有环

Given a linked list, determine if it has a cycle in it. Follow up:Can you solve it without using extra space? 题意: 给定一个链表,判断是否有环 思路: 快慢指针 若有环,则快慢指针一定会在某个节点相遇(此处省略证明) 代码: 1 public class Solution { 2 public boolean hasCycle(ListNode head) { 3 ListNode f

[LeetCode] Linked List Cycle II 单链表中的环之二

Given a linked list, return the node where the cycle begins. If there is no cycle, return null. Follow up: Can you solve it without using extra space? 这个求单链表中的环的起始点是之前那个判断单链表中是否有环的延伸,可参见我之前的一篇文章 (http://www.cnblogs.com/grandyang/p/4137187.html). 还是要设

算法总结之 判断一个链表是否是回文结构

给定一个链表的头节点head,判断是否是回文结构 1->2->1 返回true 进阶: 如果链表长度N,时间复杂度O(N) 额外空间O(1) 方法一 利用栈结构(需要额外空间) 从左到右遍历,一次压栈.   这样的到的  从栈顶到栈底的节点值出现顺序会与原链表从左到右的值出现顺序相反. 废话不多说,上代码: package TT; import java.util.Stack; public class Test92 { public class Node{ public int value;

链表--判断一个链表是否为回文结构

给定一个链表的头节点head, 请判断该链表是否为回文结构. 例如: 1->2->1, 返回true. 1->2->2->1, 返回true.15->6->15, 返回true. 1->2->3, 返回false.进阶: 如果链表长度为N, 时间复杂度达到O(N), 额外空间复杂度达到O(1). 原文地址:https://www.cnblogs.com/SkyeAngel/p/8747901.html

左神算法书籍《程序员代码面试指南》——2_06判断一个链表是否为回文结构

[题目]给定一个链表的头节点head,请判断该链表是否为回文结构.例如:1->2->1,返回true.1->2->2->1,返回true.15->6->15,返回true.1->2->3,返回false.进阶:如果链表长度为N,时间复杂度达到O(N),额外空间复杂度达到O(1).[题解]方法一:遍历一遍链表,将数据压入栈中然后再遍历一遍链表与栈的弹出数据对比方法二:使用快慢指针,将链表的前部分压入栈,然后栈数据弹出与链表的后半部分对比方法三:使用快慢指

[LC]141题 Linked List Cycle (环形链表)(链表)

①中文题目 给定一个链表,判断链表中是否有环. 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始). 如果 pos 是 -1,则在该链表中没有环. 示例 1: 输入:head = [3,2,0,-4], pos = 1输出:true解释:链表中有一个环,其尾部连接到第二个节点. 示例 2: 输入:head = [1,2], pos = 0输出:true解释:链表中有一个环,其尾部连接到第一个节点. 示例 3: 输入:head = [1], pos =

142 Linked List Cycle II 环形链表 II

给一个链表,返回链表开始入环的第一个节点. 如果链表无环,则返回 null.说明:不应修改给定的链表.补充:你是否可以不用额外空间解决此题?详见:https://leetcode.com/problems/linked-list-cycle-ii/description/ /** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val