面試中的鍊錶問題(一) 基於java

2021-07-25 23:34:49 字數 1567 閱讀 5123

2017-01-11 16:22

演算法面試普及後,傳統的資料結構和演算法課程講的太過於基礎,又遠離求職需求。需要發掘更多的前沿的資料結構和演算法題展現給讀者,以期跟的上時代的步伐。面試官在有限的面試中,讓面試者程式設計解決某些資料結構和演算法的問題,通過觀察面試者編碼的熟練程度、思考的速度和深度來衡量面試者的能力和潛力。相信仔細的推敲逐一攻克後一定會收穫頗豐。

下面看題:

給定兩個有序鍊錶的頭指標head1和head2,列印兩個鍊錶的公共部分。

難度:一星

解:因為是有序鍊錶,所以從兩個鍊錶的頭開始進行如下判斷:

如果head1的值小於head2,則head1往下移動。

如果head2的值小於head1,則head2往下移動。

如果head1的值與head2的值相等,則列印這個值,然後head1和head2都往下移動。

head1或head2有任何乙個移動到null,整個過程停止。

具體實現請看如下**:

2.反轉單向和雙向鍊錶

分別實現反轉單向鍊錶和反轉雙向鍊錶的函式

要求:如果鍊錶長度為n,時間複雜度要求為o(n),額外空間複雜度要求為o(1).

難度:一星

解:反轉單向鍊錶的函式如下,函式反回反轉之後鍊錶新的頭節點:

反轉雙向鍊錶的函式如下,函式返回反轉之後鍊錶新的頭節點:

3.反轉部分單向鍊錶

給定乙個單向鍊錶的頭節點head,以及兩個整數from和to,在單向鍊錶上把第from個節點到第to個節點這一部分進行反轉。

難度:一星

解:先判斷是否滿足1<=from<=to<=n,如果不滿足,則直接返回原來的頭節點。

找到第from-1個節點fpre和第to+1個節點tpos。fpre即是要反轉部分的前乙個節點,tpos是反轉部分的後乙個節點。把反轉的部分先反轉,然後正確地連線fpre和tpos。

例如:1->2->3->4->null,假設fpre為節點1,tpos為節點4,要反轉部分為2->3. 先反轉成3->2,然後fpre連向節點3,節點2連向tpos,就變成了1->3->2->4->null。

如果fpre為null,說明反轉部分是包含頭節點的,則返回新的頭節點,也就是沒反轉之前反轉部分的最後乙個節點,也是反轉之後反轉部分的第乙個節點;如果fpre不為null,則返回舊的頭節點。

請參照如下**reversepart方法:

今天的鍊錶問題就學到這,仔細揣摩,得到成就感不是其他能比的。

未完待續……

基於迴圈鍊錶的約瑟夫問題

pragma once includeusing namespace std templateclass linknode 乙個結構體對外全部可見 linknode const t item,linknode ptr null 資料與指標一同初始化的建構函式,依舊指標域預設引數為空 linknode...

java面試 陣列和鍊錶的區別

原文 首先 陣列在記憶體空間上是連續的,而鍊錶在記憶體空間上是可以不連續的。其中鍊錶的每個元素儲存了下乙個元素的位址,使得一系列的隨機的記憶體位址串在一起。所以只要用足夠的記憶體空間,就能為鍊錶分配記憶體。陣列優於鍊錶 記憶體空間占用少,資料可隨機訪問性,查詢速度相對較快。鍊錶優於陣列 插入和刪除的...

面試中常見鍊錶問題3 旋轉鍊錶

給定乙個單鏈表和乙個k值,把鍊錶向右旋轉k步,比如說1 2 3 4 5 null和k 2,則返回4 5 1 2 3 null。解析 1 把鍊錶分割成兩部分,前半部的長度為len k,後半部分的長度為k,其中len為鍊錶測長度。2 把後一部分鍊錶的尾指標指向前一部分鍊錶的頭指標。返回後一部分的首指標即...