17.环形链表

141. 环形链表

给你一个链表的头节点 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 <= 105
  • pos-1 或者链表中的一个 有效索引
 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         // 定义快慢指针
15         ListNode fast = head;
16         ListNode slow = head;
17 
18         // 空链表、单节点链表一定无环
19         while (fast != null && fast.next != null) {
20             fast = fast.next.next;  //快指针,每次走两步
21             slow = slow.next;       //慢指针,每次走一步
22             if(fast == slow) {      //快慢指针相遇必有环
23                 return true;
24             }
25         }
26         return false;
27     }
28 }

关键点:1.空链表、单节点链表无环

    2.设置快慢指针,若相遇则必有环

ps:链表的组成:头指针、头结点(data区域不含数据,可含链表长度等相关信息)、数据节点

主要就是下面这几点:
1. 头指针表明了链表的起点,可以唯一确定一个单链表。
2. 头指针指向链表的第一个结点,其指针域存储的是第一个结点在内存中的位置。
3. 头结点是单链表的第一个结点,若单链表有头结点,则头指针指向头结点;若单链表不含头结点,则头指针指向第一个结点。

4. 一个单链表可以没有头结点,但不能没有头指针。

5、头结点一般不存放数据,故当不存在头结点时,不严格意义情况下可以将头指针视为头结点【不严格意义】,此时便与有头结点的单向链表保持一致了呢!

(所以后续刷题遇到的head跟first都是头指针,视具体情况确定是否将其视为头结点)真正存储有意义数据的为第一个结点,而不是头结点【严格概念层面上讲】

 

 

 

posted on 2022-06-18 11:00  HHHuskie  阅读(30)  评论(0编辑  收藏  举报

导航