面試 從尾到頭列印鍊錶

2021-10-03 07:46:02 字數 2269 閱讀 1038

題目:從尾到頭列印鍊錶

要求:輸入乙個鍊錶的頭節點,從尾到頭反過來返回每個節點的值(用陣列返回)。

示例:輸入:head = [1,3,2]

輸出:[2,3,1]

限制:0 <= 鍊錶長度 <= 10000

題解1:遞迴法

因為是從尾到頭返回每乙個節點的值,所以很容易想到如果從最後的節點將值放入陣列中,然後再往前逐步將資料放入陣列,最後回到頭節點返回即可,可以想到遞迴就能輕鬆做到,只要注意遞迴函式的結束條件即可。

/**

* definition for singly-linked list.

* type listnode struct

*/func reverseprint(head *listnode) int

} if head.next != nil

return int

}

自然而然,效率不會很高~

反思了一下,其實遞迴還可以再簡短一點

/**

* definition for singly-linked list.

* type listnode struct

*/func reverseprint(head *listnode) int }}

結果如下:

題解2:反轉鍊錶

想了一下,這樣不行啊,耗時這麼長,試試不用遞迴吧~

然後就想,如果我反轉鍊錶呢,再生成陣列返回,這樣也可以實現吧?

/**

* definition for singly-linked list.

* type listnode struct

*/func reverseprint(head *listnode) int

var newhead *listnode

res := int{}

for head != nil

for newhead != nil

return res

}

結果如下:

解法3:反轉陣列

反轉鍊錶再獲取數值,可以是可以,會不會有點多餘?還不如直接順序獲取值放到陣列,再反轉結果呢~

/**

* definition for singly-linked list.

* type listnode struct

*/func reverseprint(head *listnode) int

res := int{}

for head != nil

for i, j := 0, len(res)-1; i < j;

return res

}

至此,結果有了很大的提公升:

解法4:棧

這個反轉陣列還是感覺好奇怪,有沒有更好的方法呢?把先讀到的放最後,最後的在最前面,棧不就是這樣的資料結構嗎?

/**

* definition for singly-linked list.

* type listnode struct

*/import "container/list"

func reverseprint(head *listnode) int

res := list.new()

for head != nil

ret := int{}

for e := res.front(); e != nil; e = e.next()

return ret

}

三下五除二,搞定!來看看成果:

解法5:遍歷兩次

其實到棧,我以為這題就這樣了,然而......

/**

* definition for singly-linked list.

* type listnode struct

*/func reverseprint(head *listnode) int

count := 0

newhead := head

for head != nil

res := make(int, count)

i := 0

for newhead != nil

return res

}

臥槽!!!質的提公升,既省去自動擴容的效能,也能提高處理速度:

面試 從尾到頭列印鍊錶

一 描述 輸入乙個單鏈表的頭結點,從尾到頭反過來列印出每個結點的值。鍊錶結點定義如下 class listnode 二 解題思路 此題有兩種解題思路,一種是利用遞迴的方法列印,另外一種是在從頭到尾遍歷的過程中將結點的值儲存至棧中,利用棧先進後出的特性,之後再依次列印棧中的結點元素即可。三 根據如上的...

面試 從尾到頭列印鍊錶

一 描述 輸入乙個單鏈表的頭結點,從尾到頭反過來列印出每個結點的值。鍊錶結點定義如下 class listnode 二 解題思路 此題有兩種解題思路,一種是利用遞迴的方法列印,另外一種是在從頭到尾遍歷的過程中將結點的值儲存至棧中,利用棧先進後出的特性,之後再依次列印棧中的結點元素即可。三 根據如上的...

從尾到頭列印鍊錶

題目描述 輸入乙個鍊錶,從尾到頭列印鍊錶每個節點的值。輸入 每個輸入檔案僅包含一組測試樣例。每一組測試案例包含多行,每行乙個大於0的整數,代表乙個鍊錶的節點。第一行是鍊錶第乙個節點的值,依次類推。當輸入到 1時代表鍊錶輸入完畢。1本身不屬於鍊錶。輸出 對應每個測試案例,以從尾到頭的順序輸出鍊錶每個節...