环形链表

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

 思路:

1、判断是否有环

定义两个指针,一快一慢,从头指针开始遍历,快指针不为空或者快指针的下一个结点不为空,则有环

2、返回环的位置

 

找到快、慢指针相遇的点,根据公式x=(n-1)(z+y)+z,n-1代表快指针转了多少圈,则x=z。

再定义两个指针,一个从头结点开始,另一个从fast指针与slow指针相遇的结点开始,两个指针相等时,为环形入口结点。

需要注意的点:

1、

class Solution {
public:
    ListNode *detectCycle(ListNode *head) {
        ListNode* fast=head;
        ListNode* slow=head;
        while(fast!=NULL&&fast->next!=NULL)//如果有环则在循环内部,无环则跳出循环
        {
            fast=fast->next->next;
            slow=slow->next;

            if(fast==slow)
            {
                ListNode* index1=fast;//快慢指针均可,因为接下来要步进一个指针
                ListNode* index2=head;

                while(index1!=index2)
                {
                    index1=index1->next;
                    index2=index2->next;
                }

                return index2;
            }
        }

        return NULL;
        
    }
};

 简化版:有环返回true,无环返回false

 思路:利用快慢指针的方法,当有环存在时,快指针一定会在环内追上慢指针。

首先先定义两个快慢指针,都指向head结点,然后快指针一次移动两个结点,慢指针一次移动一个结点。

while循环检测快指针本事及快指针的next是否为空,其中一个如为空则退出循环。

while循环内,判断是否快慢指针相等,如果相等则为真,如果while循环结束则为假,即不存在环。

 

bool ISlistloop(ListNode*head){
   ListNode* fast = head;
   ListNode* slow = head;
while(fast!=NULL && fast->next!= NULL){
    fast=fast->next->next;
    slow= slow->next;
  if(slow==fast){
     return ture;
           }  
   }
      return false;          
}

 

posted @ 2023-04-27 15:39  该说不唠  阅读(41)  评论(0)    收藏  举报