關於單鏈表的幾個問題

2022-07-31 05:12:11 字數 947 閱讀 6378

q:如何判斷乙個單鏈表是否有環,如果有環,找出環的入口點?

a:首先我們判斷鍊錶是否有環,設定兩個指標slow和fast,指向單鏈表的頭部,每個迴圈slow走一步,fast走兩步。如果沒有環,fast或者fast的next會走到null,否則fast在環裡迴圈最終會和slow相遇,此時即存在環。

再看第二個問題,當slow和fast相遇時,假設fast已經在環內迴圈n圈,環長為r,同時fast走的長度為slow走的長度的兩倍,設slow走了s步,則有

2*s=s+n*r => s=n*r,再設單鏈表頭部到環入口的距離為a,環入口到相遇點得距離為x,則a+x=s=n*r,因此從單鏈表頭部到相遇點的距離為環長的整數倍,因此我們可以將slow或fast指向單鏈表頭部,和另外乙個指標每次一步往前走,則再次相遇時他們同時指向的就是環的入口點。

1

struct

node2;

678 node* findloopentrance(node*head)920

21//

無環22

if(!fast || !fast->next)

23return

null;

2425 slow=head;

26while(slow!=fast)

2731

return

slow;

32 }

q:找出兩個單鏈表的第乙個公共結點。

a:方法1:將第乙個單鏈表首尾連線,判斷第二個單鏈表有沒有環,如果有則說明兩個單鏈表相交,此時可以求出第二個單鏈表的環入口結點,即為第乙個公共結點。

方法2:如果兩個單鏈表相交,則他們從第乙個公共結點到最後乙個結點肯定都相同,此時求出兩個單鏈表的長度lena和lenb,假設lena>lenb,則將指向a煉表頭的指標先前進(lena-lenb)步,而指向b鍊錶的指標此時還指向b煉表頭,然後再將兩個鍊錶每次各走一步,則相遇就在第乙個公共結點。

單鏈表關於環的幾個問題

問題 1.單鏈表是否有環 2.環的節點長度 3.環的入口節點 4.表頭到環入口的節點長度 問題1.思路 在表頭設定fast slow指標,fast一次遍歷兩個節點,slow一次遍歷乙個節點,若相遇則證明有環,反之則不存在環 引入快慢指標,若指標相遇則證明鍊錶有環 node findring node...

關於單鏈表的幾個有意思的問題

q1 已知指向單鏈表的header指標,如何判斷該單鏈表是否存在環?q2 已知兩個單鏈表,它們可能存在重疊的部分,也就是y字形鍊錶,如何判斷這兩個鍊錶是否存在y字形?q3 已知指向單鏈表的header指標,如何高效的輸出單鏈表的倒數第n個節點?最後乙個節點為倒數第0個節點 q4 不知道單鏈表的hea...

關於單鏈表

單鏈表結構體 typedef struct student node 建立單鏈表 node create else p head while cycle else head head next p next null printf n yyy d head data return head 單鏈表測...