劍指offer 面試題24 反轉鍊錶

2021-10-02 21:46:56 字數 3119 閱讀 8869

開始行動,你已經成功一半了,獻給正在奮鬥的我們

定義乙個函式,輸入乙個鍊錶的頭節點,反轉該鍊錶並輸出反轉過後的鍊錶的頭節點。

鍊錶的節點定義如下:

public

class

listnode

}

首先,我們要明確鍊錶要怎麼刪除和新增乙個元素;

單向鍊錶是不能夠自我刪除的,因為單向鍊錶除了刪除頭節點,刪除的節點的方法只有乙個就是將這個節點的前乙個節點的引用指向這個節點的下乙個節點;

(**於網路)

就比如說,你是中間的小男孩,牽著兩個女孩的手,那麼他們要怎麼放棄你呢,就是你左邊的女孩牽起來你右邊女孩的手,你就不再這個小團體裡面了。

那這個小男孩又要怎麼進來了,那就是分四步:

1) 左邊的女孩放開右邊的女孩的手

2) 左邊的女孩牽起這個小男孩的手

3)小男孩牽起右邊女孩的手

如果要是有個小男孩想站在最左邊的女孩旁邊呢?那就簡單了,就一步,牽起最左邊女孩的手即可。

同理,向鍊錶的頭新增元素,只需要把新元素的下一節點的引用指向原來的頭節點即可。

向鍊錶的中間新增元素,需要前一節點的下一節點引用指向要新增的元素,要新增的元素的下一節點引用指向原來下一節點的引用。

那我們要怎麼讓去反轉乙個鍊錶呢?

我們可以依次遍歷鍊錶,把鍊錶的元素乙個乙個的拆下來,依次依次的放到新鍊錶裡面,先來的節點都是原來靠前的,既然要反轉,就需要將它放到後面。這樣先來的放到後面,最後來的就成了第乙個節點,整個鍊錶就反轉了。

比如我們有如下的鍊錶,鍊錶中共有四個元素;

我們先把節點1拆下來;

如果這裡節點1是個null,我們很容易空指標,並且不容易操作,所以我們一般會建乙個虛擬節點,讓第乙個元素下來就能被掛在虛擬節點的身後,這樣就算頭節點是null。最後返回結果的時候返回的是虛擬節點的下乙個節點,定多返回null,不是空指標。

把節點1掛在虛擬節點上面;

然後把節點2拆下來,讓虛擬節點的下乙個節點指向節點2,節點2的下乙個節點指向節點1,這樣前兩個節點就被反轉了;

一直如上操作,最後把虛擬節點4掛在虛擬節點後面,節點3下一節點指向節點3;

最後不要虛擬節點,直接返回虛擬節點的下乙個節點;

即反轉後的鍊錶;

原理很容易懂,但是切記,懂了和能寫出來是兩碼事;

編碼中首先要注意**的健壯性,當然你使用了虛擬節點,不太可能空指標。

其次,把乙個拆下來的節點放到新鍊錶這塊的操作很繞,因為你需要記得每乙個物件的下乙個引用都指向誰了,一不小心很容易出現鍊錶斷裂和死迴圈鍊錶;

我的建議是,盡量理解,不理解也沒關係,我們只要記住,一共四步;(順序不錯,乙個都不能錯)

1) 記錄下來你要拆下來的節點的下一節點引用物件(第一步一定是這個,因為你不記住這個物件,你講找不到你要遍歷的下乙個節點)

2)原下乙個節點已經記住了,那麼就把拆下來的節點的下乙個節點換成虛擬節點的下乙個節點(就是原來老大變成現在的老二的過程)

3)把虛擬頭節點的下乙個節點換成拆下來的節點(新老大上位)

4)遍歷的指標由拆下來的節點程式設計1)中保留的拆下來的節點的原來的下乙個節點

ps:這裡筆者使用的jdk為1.8版本

public

class

num206_reverselist))

);}public

static listnode reverselist

(listnode first)

return virtual.next;

}}

linkedlistutil為筆者自己定義方便做鍊錶題目的工具類,**如下:

/**

* @program: algorithm_code

* @description: 鍊錶工具類

* @author: yanghang

* @create: 2019-09-01 21:56

**/public

class

linkedlistutil

listnode first =

newlistnode

(numbers[0]

);listnode intermediatevariables = first;

for(

int i =

1; i < numbers.length; i++

)return first;

}/**

* 列印乙個鍊錶

*/public

static

void

printlinkedlist

(listnode first)

system.out.

println()

;}// 測試工具類

劍指offer 面試題24 反轉鍊錶

完整 位址 定義乙個函式,輸入乙個鍊錶的頭結點,反轉該鍊錶並輸出反轉後鍊錶的頭結點 很簡單,單純考察 的魯棒性 要針對區分成以下三種情況處理 1.輸入的煉表頭指標為null 2.輸入的鍊錶只有乙個節點 3.輸入的鍊錶有多個節點 正常情況 public static class listnode pu...

劍指offer 面試題24 鍊錶反轉

題目 輸入乙個鍊錶,反轉鍊錶後,輸出鍊錶的所有元素。思路 需要定義三個節點,當前節點pnode,前一節點ppre,和後一節點pnext。要將當前節點的下一節點pnode next用下一節點儲存起來,避免在反轉時發生鍊錶斷裂。然後將當前節點指向前一節點,然後將當前節點的指標移到下一節點,前一節點和下一...

《劍指offer 面試題24 反轉鍊錶》

劍指offer 面試題24 反轉鍊錶 註明 僅個人學習筆記 反轉鍊錶 public class reverselist24 鍊錶節點唯一時,返回頭節點 if head.next null node preversehead null node pnode head node prenode null...