2022-5-10 链表

给你一个链表的头节点 head ,判断链表中是否有环。

如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。注意:pos 不作为参数进行传递 。仅仅是为了标识链表的实际情况。

如果链表中存在环 ,则返回 true 。 否则,返回 false 。

 1 /**
 2  * Definition for singly-linked list.
 3  * class ListNode {
 4  *     int val;
 5  *     ListNode next;
 6  *     ListNode(int x) {
 7  *         val = x;
 8  *         next = null;
 9  *     }
10  * }
11  */
12 public class Solution {
13     public boolean hasCycle(ListNode head) {
14         ListNode fast=head,slow=head;
15         while (fast!=null&&fast.next!=null){
16             fast=fast.next.next;
17             slow=slow.next;
18             if (fast==slow) return true;
19         }
20         return false;
21     }
22 }

思路:快慢指针,如果相交有环,否则没有。

 

给定一个链表的头节点  head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null

如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。

不允许修改 链表。

 1 /**
 2  * Definition for singly-linked list.
 3  * class ListNode {
 4  *     int val;
 5  *     ListNode next;
 6  *     ListNode(int x) {
 7  *         val = x;
 8  *         next = null;
 9  *     }
10  * }
11  */
12 public class Solution {
13     public ListNode detectCycle(ListNode head) {
14         ListNode fast=head,slow=head;
15         while (fast!=null&&fast.next!=null){
16             fast=fast.next.next;
17             slow=slow.next;
18             if (fast==slow) break;
19         }
20         if (fast==null||fast.next==null) return null;
21         fast=head;
22         while (fast!=slow){
23             fast=fast.next;
24             slow=slow.next;
25         }
26         return fast;
27     }
28 }

思路:如果有环,在相遇点处让快指针从头开始,则快慢指针必定在环处相交。可数学推导。

posted on 2022-05-10 14:45  阿ming  阅读(20)  评论(0编辑  收藏  举报

导航