1. 程式人生 > >單鏈表求環的起始位置(快慢指標)

單鏈表求環的起始位置(快慢指標)

#include<iostream>
#include"ListNode.h"


class Solution2{

    public:
        ListNode* findCycle(ListNode* list){
        
            ListNode* fast = list;
            ListNode* slow = list;
            ListNode* meet = NULL;
//查詢到快慢指標相遇位置並記錄
            while(fast){
                
                fast = fast->next;
                slow = slow->next;
                
                if(!fast){
                    return NULL;
                }

                fast = fast->next;

                if(fast == slow){
                    meet = fast;
                    break;
                }         
            }
//判斷相遇位置在末尾
           if(meet ==  NULL){
 
               return NULL;
           }

//一個指標從頭節點開始,一個指標從相遇節點開始遍歷,
//直到相遇,就是環開始的位置
             while(meet && list){

                 if(list == meet){
                     //返回相遇位置
                     return list;
                 }

                 list = list->next;
                 meet = meet->next;
             }

             return NULL;
            
        }
};
    



int main()
{
  ListNode a(8);
  ListNode b(1);
  ListNode c(2);
  ListNode d(3);
  ListNode e(4);
  a.next=&b;
  b.next=&c;
  c.next=&d;
  d.next=&c;
  std::cout<<"the List has been generated!"<<std::endl;
  ListNode* p = &a;
  Solution2 solution;
  ListNode*   result =solution.findCycle(p);
   std::cout<<"result: "<<result->val<<std::endl;
    return 0;
}

相關推薦

單鏈起始位置快慢指標

#include<iostream> #include"ListNode.h" class Solution2{ public: ListNode* findCycle(ListNode* list){

單鏈 及重要的快慢指標思想

判斷單鏈表有環的基本思路:設定快慢指標slow fast, 若有環,則二者一定會相遇,若沒有環,則快指標先到達連結串列末尾 證明思路:若有環,則當slow進入環的時候,fast必定已經在環中  此時設fast位置為0,slow位置為k 則 若在k+m位置相遇,相當

資料結構之單鏈的增刪改查java版

talk is cheap,show you zhe code; /* * 單鏈表的遍歷是從第0個節點開始 沿著next鏈,一次訪問每個節點並且每個節點只能訪問一次 * 當頭結點head為空時 此連結串列為空連結串列 * * 插入操作 * 1空

判斷單鏈是否形成環形結構,快慢指標

判斷一個單鏈表是否有環,若有,找出環的入口節點 分析: 一個單鏈表有環,必須是連結串列尾部帶環; 判斷單鏈表是否有環,利用快慢指標的原理, 設定快慢指標 fast 、 slow 都指向單鏈表的頭節點, 其中 fast 的移動速度是 slow 的2倍

單鏈實現氣泡排序演算法C實現

本實現主要採用交換指標的方法,其中附加有單鏈表及其相關的實現 #include <stdio.h> struct Node; typedef struct Node *PtrToNode; typedef PtrToNode List; typedef Pt

《資料結構與演算法——C語言描述》答案 3.11 查詢單鏈中的特定元素遞迴

轉載請註明出處:http://blog.csdn.net/xdz78 #include <stdio.h> #include <stdlib.h> //查詢單鏈表中的特定元

領釦——141環形連結串列快慢指標

給定一個連結串列,判斷連結串列中是否有環。 /** * Definition for singly-linked list. * class ListNode { * int val; * ListNode next; * ListNode(int x)

資料結構 - 如何找到有單鏈的入口位置C++

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

單鏈交叉問題單鏈存在的問題

有環 AI 連接 s/4 交叉 www max tps 帶環單鏈表 判斷兩個單鏈表是否交叉: https://blog.csdn.net/tianyunzqs/article/details/48413165 最佳方法:O(max[m.n]) 如果兩個單鏈表都是無環的單鏈表

經典案例-連結串列操作的幾大經典例子 單鏈反轉 的檢測 中間節點 有序連結串列合併等

這篇博文 主要總結連結串列在應用時的幾個重要案例。學習之前,最好能夠掌握連結串列相關的一些基礎知識,以及連結串列中資料的插入、刪除操作如何實現等等,這些網上資料很多,這裡沒有做過多介紹,不熟悉的同學可以看程式碼之前簡單瞭解一下。 1.單鏈表反轉    連結串列中環的檢測  

約瑟夫的數學推導、數學方法最後出圈的數字、迴圈單鏈所有出圈數字順序

約瑟夫環是一個數學的應用問題:已知n個人(以編號1,2,3…n分別表示)圍坐在一張圓桌周圍;從編號為k的人開始報數,數到m的那個人出列;他的下一個人又從1開始報數,數到m的那個人又出列;依此規律重複下去,直到圓桌周圍的人全部出列。 前幾天,在一篇文章中得知了約瑟夫環的問

解題筆記30——找含單鏈入口點

      問題描述:有一個單鏈表,其中可能有一個環,也就是某個節點的next指向的是連結串列中在它之前的節點,這樣在連結串列的尾部形成一環。如果連結串列存在環,找到環的入口點?       思路:這道題的原型可能來自《C專家程式設計》一書,題目為”怎樣才能檢測到連結串

單鏈 | 循刪除中所有最小值並輸出

show 初始 tdi 刪除 lis ons span closed lose 王道P38T19 代碼: void del_min(LinkList& L){ LNode*p=L,*mp=L; while(p->next!=p){

演算法-單鏈

演算法-單鏈表及環   碰到一個問題,單鏈表及環的問題,整理一下各種解法:   1.1.    是否有環 連結串列唯一標識列表化,遍歷連結串列,判斷表中是否有當前節點唯一標識,有代表有環,無則將當前節點唯一標識加入列表。 時間複雜度最優,

java經典面試題:單鏈反轉問題詳解含遞迴法

java經典面試題:單鏈表反轉問題,有兩種方法,一種為迴圈遍歷法,一種遞迴法。 1、迴圈遍歷法   首先設定三個節點,把當前節點的下一節點指向它前面的節點,此時你會發現指標鏈會斷,所以要先把它後面一個節點用nextNode儲存下來,之後把節點向後移動遍歷即可。    程式碼如下: //

單鏈——兩個集合的差集 A,B集合差集放到C連結串列中

#include <stdio.h> #include <malloc.h> typedef struct Node { int data; struct Node *next; }LNode,*LinkList; void list

單鏈兩個集合交集

#include using namespace std; template struct node { t data; node*next; }; template class linklist { public: linklist();

單鏈排序函式指標

問題描述: 使用者輸入資料,構成單鏈表,然後對單鏈表進行排序,能夠隨意切換排序的方法(列入升序降序)。 PS: 要隨意切換排序的方法,那麼使用函式指標作為引數傳入到排序函式中,那麼函式指標指向的函式就可以方便的制定排序規則了。 參考程式碼: #define _CRT_SE

單鏈

下一個 空間 控制 malloc 繼續 系統 urn nod 申請 #include <stdio.h>#include <stdlib.h>typedef struct LNode *Node;  //定義指向LNode類型的指針Nodestruc