1. 程式人生 > >九章演算法【總結】Java 搞定連結串列-面試常考題目精選

九章演算法【總結】Java 搞定連結串列-面試常考題目精選

面試大總結之連結串列
CS3K.com
一、OverView:
連結串列是面試中常考的,本文參考了其它一些文章,加上小編的自己總結,基本每個演算法都測試並優化過。
演算法大全(1)單鏈表 中還有一些連結串列題目,將來也會整理進來。這些題目雖然簡單,但如果能毫無BUG地寫出,定能讓面試官司對您印象分大增。

小亮點是:主頁君用Recursion 和 Iterator 各寫了一次所有題目,這樣就算遇到不熟悉的寫法,我們也都可以運用自如。

二、程式碼
以下是GitHub的程式碼連結,歡迎大家指正:

ListNodeDemo.java
CS3K.com

三、程式碼目錄:

求單鏈表中結點的個數:
getListLength
將單鏈表反轉:
reverseList(遍歷),reverseListRec(遞迴)
查詢單鏈表中的倒數第K個節點(k > 0):
reGetKthNode
查詢單鏈表的中間結點:
getMiddleNode
從尾到頭列印單鏈表:
reversePrintListStack,reversePrintListRec(遞迴)
已知兩個單鏈表pHead1 和pHead2 各自有序,把它們合併成一個連結串列依然有序:
mergeSortedList, mergeSortedListRec
判斷一個單鏈表中是否有環:
hasCycle
判斷兩個單鏈表是否相交:
isIntersect
求兩個單鏈表相交的第一個節點:
getFirstCommonNode
已知一個單鏈表中存在環,求進入環中的第一個節點:
detectCycle, getFirstNodeInCycleHashMap
給出一單鏈表頭指標pHead和一節點指標pToBeDeleted,O(1)時間複雜度刪除節點
pToBeDeleted: delete
CS3K.com
四、總結規律:CS3K.com

DummyNode的使用。
做連結串列題目時,如果我們需要返回頭部,一般情況我們可以建立一個虛擬節點,叫DummyNode,把頭部掛在它的後面。這樣就算頭部變化了之後,只要返回DummyNode.next就能輕鬆得到新頭部,而不用糾結新的頭部到底 在哪裡。
Merge LinkedList是相當基礎的題目,這麼多題目是基於它的,必須寫熟。
Reverse linkedList最簡單的寫法就是建立DummyNode,然後把舊的連結串列不斷插入到DummyNode的後面,就能輕鬆地返回連結串列了。
操作連結串列的時候,我們經常會改變某些Node的下一個節點。如果你希望待一下會再用到被改變掉的下一個節點,請一定記得用tmp先把它儲存起來。
查詢連結串列的中間節點:使用2個快慢指標 ,一個進2步,一個進1步,快指標到達終點時,慢指標就會停留在連結串列的中間位置了。
CS3K.com
---------------------
作者: 九章演算法  
來源:CSDN
原文:https://blog.csdn.net/jiuzhangsuanfa/article/details/83689118
版權宣告:本文為博主原創文章,轉載請附上博文連結!