1.1. 题目

1.1.1. 环形链表

给定一个链表,判断链表中是否有环。

为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。

示例 1:

输入:head = [3,2,0,-4], pos = 1
输出:true
解释:链表中有一个环,其尾部连接到第二个节点。

环形链表

示例 2:

输入:head = [1,2], pos = 0
输出:true
解释:链表中有一个环,其尾部连接到第一个节点。

环形链表

示例 3:

输入:head = [1], pos = -1
输出:false
解释:链表中没有环。

环形链表




1.1.2. 题解:

  • 建议不要太仔细研究题目!题目给的pos只是为了调试用的......跟实际你代码没有任何关系的
  • 环形链表可能是某个节点又指回了之前的某个节点,然后形成了一个环形
  • 如果是环形链表,一直遍历的话,是找不到末尾节点的!所以常规的遍历到最后一个是行不通的

1.1.3. 思路:

  • 作弊做法: 遍历每个节点,把每个节点的地址存到一个map里,每遍历一个检查一下是否有重复的!如果有的话,那么肯定是环形的,就不需要继续遍历了,如果没有,肯定会走到最后nil的!
  • 正常解法: 快慢指针,可以设定一个指针每次直走一个节点,另外一个指针每次走两个! 如果有环形,肯定会相遇(参考时钟的时针和分针),如果没有环形,走得快的很快就走到最后nil

1.1.4. 代码:

点击显示
 func hasCycle(head *ListNode) bool {
     if head == nil || head.Next == nil {
         return false
     }

     head1 := head
     head2 := head
     for head2.Next.Next != nil {
         if head1.Next == head2.Next.Next {
             return true
         }
         head1 = head1.Next
         head2 = head2.Next.Next
         if head2.Next == nil {
             return false
         }
     }

     return false
 }

results matching ""

    No results matching ""