單鏈表面試題系列之帶環鍊錶的入口點

2021-07-13 09:51:40 字數 2663 閱讀 2508

//  本篇博文闡述如何找到帶環鍊錶的入口點,那麼,首先有必要闡述一下什麼是帶環鍊錶?如何判斷鍊錶是否帶環?

帶環鍊錶

即鍊錶中有迴圈的部分,通俗的說就是沒有尾節點!例如:

判斷鍊錶是否帶環:

那麼知道了什麼是帶環鍊錶,接下來就是判斷鍊錶是否帶環的判斷問題了,其實也很簡單,首先最簡單的是判斷出不

帶環的鍊錶,只要可以找到尾結點即鍊錶不帶環,那麼,帶環的鍊錶怎麼判斷? 這裡就用到前面部落格講到的快慢指標

了,定義兩個指標:slow,fast; fast每次走兩步,slow每次走一步,在鍊錶帶環的情況下,slow和fast必然會相遇,而

且相遇點必然在環內,這個不難理解吧! 既然這樣,那我們就先實現判斷鍊錶帶環的**!

#include#include#includetypedef int datatype;

typedef struct linknode

linknode,*plinknode;//結點結構體

typedef struct linklist

linklist ,*plinklist;//鍊錶

void pushback(plinklist plist,datatype x)

assert(plist);

cur = plist ->phead ;

newnode ->data = x;

newnode ->next = null;

if(cur == null)

while(cur)

pvr->next = newnode ;

}//尾插

void initlinklist(plinklist plist)

//初始化列表

@ 判斷鍊錶是否帶環演算法:

//構造有環鏈表

void makering(plinklist plist1)

if(pvr != null)

pvr->next = plist1 ->phead ;//找到尾結點,讓它可以指向前面的結點!

}//判斷鍊錶是否帶環

int judge_ring(plinklist plist)

return 0;//否則返回0,代表無環;

}void test3()

int main()

@ 既然已經會判斷鍊錶是否帶環了,接下來就得找找這環的入口點,所謂入口點,就是環的開始的那個結點;現在如何去找這個結點呢? 我再這裡將推理過程列了出來,因為畫工太差,就只有文字描述了;

@ 其實,仔細想想的話,無非就是從表頭到入口點距離為 a,當知道相遇點後,從表頭開始乙個指標start,而要通過

環內指標找入口點,都是一次走一步,則環內指標要與start在入口點相遇,那麼最起碼環內指標走的距離也是a,這

樣的話,方向就明確了,只要找到a的關係捋一下, s = a + x;   s = nr; 則 a + x  = nr;而指標此時開始走肯定是走的

是 t 這段距離,那麼看看可不可以找到 a 和 t 的關係,既然環的一圈是r, 那麼 x+t = r,沒問題吧;則前面的 a + x =

nr,是不是可以變為 a = (n - 1)r + t;  即從環內指標從 t 開始走,走過 n - 1 圈後,和start從表頭開始走,直到相遇時,

走過的距離都是 a(注意:a表示的是從表頭到入口點的距離);即start和環內指標相遇時必然是入口點!

**實現:

//有環則找出入口點

plinknode findentry(plinklist plist)

meet = slow;//用meet來存放相遇點;

if(fast == null || fast->next == null)

return null;

start = plist ->phead ;

while(start != meet)

return start;//最後返回入口點;

}void test4()

畫圖功底比較差,找入口點這裡也比較難理解,所以文字描述的比較詳細;

找入口點的方法還可以用雜湊表儲存指標的方法,後續會補充!

講的比較粗糙,還望諒解!

單鏈表面試題 帶環鍊錶的入口點

昨天做了乙個小總結,發現單鏈表這塊關於帶環鍊錶漏掉了,今天就來總結一下。要尋找乙個單鏈表的環的入口點,首先得判斷乙個鍊錶是否帶環,那麼又怎樣判斷乙個單鏈表是否帶環呢?首先我們得普及一下環有什麼特性,我們知道無環的單鏈表有首節點和尾節點,那麼帶環的單鏈表呢?顯然還是有首節點的,但是沒有尾節點吧。如圖所...

單鏈表面試題 鍊錶帶環問題

判斷單鏈表是否帶環,並求得相遇點 思路 快慢指標問題,前面已經講過快慢指標原理,在這裡不再詳細描述 當快指標比慢指標多走一步,在某個環內一定會相遇在某一點 反過來則有 當兩個快慢指標在某一點相遇,這個鍊錶一定是帶環的鍊錶,反之不帶環 具體過程如圖 具體 鍊錶是否帶環 並返回相遇點 slistnode...

單鏈表 (面試題)

關於單鏈表的基本操作,之前已經總結過了,那些掌握之後算是了解了單鏈表是什麼?不過現在面試的題中,肯定不會只讓你回答單鏈表的基礎操作,總是會改變一些東西,或是擴充套件一下。下面就是一些關於單鏈表的擴充套件內容 include include include pragma warning disable...