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

九章算法【總結】Java 搞定鏈表-面試常考題目精選

反轉 iterator 自己 最簡 middle 改變 刪除節點 listnode pri

面試大總結之鏈表
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
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!

九章算法【總結】Java 搞定鏈表-面試常考題目精選