面試中必知必會的那些題 第一題 單鏈表倒置

2021-09-06 19:00:02 字數 2211 閱讀 1311

我想你去很多家公司面試的時候,遇到單鏈表倒置的問題可能比較多,如果一定要給面試題來乙個排名,估計也能上top10吧,其實這個

題目玩的是技巧和你對單鏈表的理解,其實我們仔細想想也不是很難,既然是倒置,那我們一定是一定要走一遍單鏈表的,對吧,那麼走單鏈

表有兩種形式,遞迴和迴圈兩種方式,而遞迴正是壓棧和出棧,那麼我們就想起來了,這不就是順序和逆序的關係嗎?第二種就是迴圈,還記

得我們曾今學習單鏈表的時候有一種插法叫做頭插法,這種插入複雜度為o(1),不好的地方就是順序插入的數字,出來的時候卻是反的,所以這

個不就是可以將原先的鍊錶原地倒置過來嗎?

一:遞迴

說到遞迴,我們腦子裡面一定要有乙個v型圖,還有乙個就是好記性不如爛筆頭,演算法這東西很難用腦子想的清楚的,多畫畫圖就見青天了,

下面我就舉個簡單的例子:現有鍊錶l=,需要將l倒置,然後我就畫好了v型圖。

從圖中可以看到,當我遞迴到3再出棧的時候,只需要將6賦給3.next,1賦給6.next,然後這樣以此類推。。。最後結果就出來了,貌似

口頭上描述起來很簡單,但是在寫**的時候需要注意以下幾個點,先上**說話。

1

public

linknode reverse(linknode node)

2

第一點:我們在走鍊錶的時候,可以操控的只有兩個結點,node和node.next,所以遞迴出口的時候,一定不能使用最常見的寫法。

1

if (node == null)2

return node;

而應該像下面這麼寫,其實就告訴我們只需要走到6節點就行了,用6.next來判斷下是不是鏈尾,這樣做是方便我們進行node和

node.next進行節點交換。

1

if (node.next == null)2

return node;

第二點:當我們每一次出棧的時候,其實也是退到曾今壓棧時的方法環境中,進行節點交換的時候,也只能在當前的方法上下文中起效,比如

說:出棧到1的時候,其實3和6的節點已經交換了,但是1這個方法環境不知道,它仍然指向6,但此時節點6.next再也不是3了,因為

曾今3和6進行了交換,所以這不是我們所期望的,所以在回退的時候,一定要有乙個鍊錶儲存這個所有節點交換的集合,恰巧在鍊錶中

有乙個特徵就是,只要我有乙個指標始終指向頭結點的位址,它就相當於乙個集

合的功能了,因為我不管你後面節點怎麼轉換,我都可以

通過head.next依次找到

後面痙攣的所有結點,比如下圖中在出棧的過程中,每

個出棧的方法環境中都依次交換了node和node.next結

點,而我的prevnode始終指向的是結點3,所以我通過3.next就可以

找到後面所有的

變化,所以這裡就是prevnode的精妙之處。

最後看一下倒置的輸出結果:

二:非遞迴實現

如果你知道頭插法,那麼迴圈實現真的很簡單,不像遞迴做法很難想到那個prevnode節點,我們知道頭插法是把新節點插入到鍊錶的頭部,

而我們遍歷的時候又可以控制兩個節點node和node.next,所以依次採用頭插法,將node.next插入到node之前,有人說,那插入到node節

點之前不就亂了嗎?所以在操作之前,我可以把node.next先儲存起來,比如放到申請的乙個叫next的節點上,為了儲存新轉換的節點,我們再

申請乙個prev結點來儲存頭插法中的新節點。

為了好理解,畫圖如下,其實這裡要注意,結點還是那些結點,並沒有刪除再新增。

其實我們發現,**只有那麼一點點,但是資訊量還是蠻大的,這些東西要是用口頭描述還是很累的。

面試中必知必會的那些題 第一題 單鏈表倒置

我想你去很多家公司面試的時候,遇到單鏈表倒置的問題可能比較多,如果一定要給面試題來乙個排名,估計也能上top10吧,其實這個 題目玩的是技巧和你對單鏈表的理解,其實我們仔細想想也不是很難,既然是倒置,那我們一定是一定要走一遍單鏈表的,對吧,那麼走單鏈 表有兩種形式,遞迴和迴圈兩種方式,而遞迴正是壓棧...

猿人學的第一題

思路 分析m後面的加密資訊 這個符號手打搜不到,複製可以。題目 和好幾個人多部落格鏈結,研究三天才理清思路,自學太難了 import requests import execjs import jsonpath class js one def init self,page self.page pa...

B君的第一題

1.1 題目大意 大概是個比較有趣的面試題。1.2 題目分析 首先考慮如何計算當前的勝率。這個有兩種演算法,動態規劃和組合數。1.3 動態規劃 假設當前甲贏了 i 場,乙贏了 j 場。如果 i n,那麼 fi,j 1。如果 j n,那麼 fi,j 0。對於一般情況,有 fi,j 1 2 fi 1,j...