單鏈表面試題集合

2021-07-28 19:23:49 字數 1912 閱讀 6931

1、找出單鏈表的倒數第k個元素(僅允許遍歷一遍鍊錶)

使用指標追趕的方法。定義兩個指標fast和slow,fast先走k步,然後fast和slow同時繼續走。當fast到鍊錶尾部時,slow指向倒數第k個。注意要考慮鍊錶長度應該大於k。

2、找出單鏈表的中間元素(僅允許遍歷一遍鍊錶)

使用指標追趕的方法。fast每次走倆步,slow每次走一步。當fast到鍊錶尾部時,slow指向鍊錶的中間元素。

3、判斷單鏈表是否有環?

方法一:使用指標追趕的方法。slow指標每次走一步,fast指標每次走兩步。如存在環,則兩者相遇;如不存在環,fast遇到null退出。

方法二:使用p、q兩個指標,p總是向前走,但q每次都從頭開始走。

4、如何知道環的長度?

記錄下碰撞點(或者找在環中任意一結點都可以),讓slow從碰撞點開始,繞著環走一圈,再次到碰撞點的位置時,所走過的結點數就是環的長度s。

5、如何找到環的入口?

分別從碰撞點、頭指標開始走,相遇的那個點就是連線點。

6、判斷兩個鍊錶(無環)是否相交?

方法一:採用暴力的方法,遍歷兩個鍊錶,在遍歷的過程中進行比較,看節點是否相同。

方法二:兩鍊錶一旦相交,相交節點一定有相同的記憶體位址,因此利用記憶體位址建立雜湊表,如此通過判斷兩個鍊錶中是否存在記憶體位址相同的節點判斷兩個鍊錶是否相交。具體做法是:遍歷第乙個鍊錶,並利用位址建立雜湊表,遍歷第二個鍊錶,看看位址雜湊值是否和第乙個表中的節點位址值有相同即可判斷兩個鍊錶是否相交。時間複雜度o((length(a)+ length(b))

方法三:問題轉化法。先遍歷第乙個鍊錶到其尾部,然後將尾部的原本指向null的next指標指向第二個鍊錶。這樣兩個鍊錶就合成了乙個鍊錶,問題轉變為判斷新的鍊錶是否有環?

方法四:一旦兩個鍊錶相交,那麼兩個鍊錶從相交節點開始到尾節點一定都是相同的節點。所以,如果他們相交的話,那麼他們最後的乙個節點一定是相同的,因此分別遍歷到兩個鍊錶的尾部,然後判斷他們是否相同。

7、如何知道兩個單鏈表(可能有環)是否相交

思路:根據兩個鍊錶是否有環來分別處理,若相交這個環屬於兩個鍊錶共有

(1)如果兩個鍊錶都沒有環。

(2)乙個有環,乙個沒環。肯定不相交

(3)兩個都有環。

①求出a的環入口,判斷其是否在b鍊錶上,如果在,則相交。

② 在a鍊錶上,使用指標追趕的方法,找到兩個指標碰撞點,之後判斷碰撞點是否在b鍊錶上。如果在,則相交。

8、尋找兩個相交鍊錶的第乙個公共節點  

方法一:最簡單的方法就是先順序訪問其中乙個鍊錶,在每訪問乙個節點時,都對另外乙個鍊錶進行遍歷,直到找到乙個相等的節點位置,如果鍊錶長度分別是m,n 則時間複雜度為o(mn)。

方法二:(兩種情況)

① 相交的點,在環外。如果兩個鍊錶有公共節點,那麼該公共節點之後的所有節點都是兩個鍊錶所共有的,所以長度一定也是相等的,如果兩個鍊錶的總長度是相等的,那麼我們對兩個鍊錶進行遍歷,則一定同時到達第乙個公共節點。但是鍊錶的長度實際上不一定相同,所以計算出兩個鍊錶的長度之差n,然後讓長的那個鍊錶先移動n步,短的鍊錶再開始向後遍歷,這樣他們一定同時到達第乙個公共節點,我們只需要在向後移動的時候比較兩個鍊錶的節點是否相等就可以獲得第乙個公共節點。時間複雜度是o(m+n)。

② 相交的點在環內。當交點在環中時,此時的交點可以是a鍊錶中的環入口點,也可以是b鍊錶中環入口點。這是因為如果把b看出乙個完整的鍊錶,而a指向了b鍊錶,則此時交點是a的環入口點。反之交點是鍊錶b的環入口點。     

思路:根據上述分析,可以直接求出a的環入口點或者b的環入口點就可以了。

單鏈表 (面試題)

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

單鏈表面試題

1.倒序列印鍊錶 void reverseprint slistnode pfirst 有兩種方法 1.遞迴操作 2.非遞迴操作 2 非遞迴 slistnode pend slistnode pcur pend null while pfirst pend pend pcur printf d pe...

單鏈表(面試題)

鍊錶反轉思路 1.單鏈表中有效節點的個數 2.查詢單鏈表中弟第k個節點 3.單鏈表的反轉 實現 如下 public class testlink 1單鏈表中有效節點的個數 遍歷得出個數 public static intcount heronode head int count 0 while tr...