劍指offer 6 從頭到尾列印鍊錶

2021-10-04 12:33:34 字數 1855 閱讀 1863

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

示例 1:

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

輸出:[2,3,1]

th:逆序列印 我們可以將鍊錶loop一遍,push到棧中。然後pop出 因為棧是先進後出 所有最後順序就是逆序的順序。 這裡建議push最好是val push node的話 占用的記憶體空間比較大。

time: o(n) 需要遍歷一遍鍊錶

space:o(n) 需要大小為size的陣列儲存資料。

public

int[

]reverseprint

(listnode head)

stack

stack =

newstack

<

>()

;

listnode cur = head;

while

(cur!=null)

int[

] array =

newint

[stack.

size()

];int i =0;

while

(!stack.

isempty()

)return array;

}

th: 遞推階段:每次傳入head.next 以head.next ==null 為終止條件,此時返回。

回溯節點:層層回溯時,將以當前節點值加入列表。

最後轉換成int陣列即可。

time:o(n) 遍歷鍊錶n次

space:o(n) 系統遞迴需要使用o(n)的棧空間

list

list =

newarraylist

<

>()

;/***

2.遞迴

*/public

int[

]reverseprint

(listnode head)

return array;

}public

void

reverse

(listnode curr)

//2.遞迴子問題

reverse

(curr.next)

;// 3.業務邏輯

list.

add(curr)

;}

頭插法顧名思義是將節點插入到頭部,在遍歷原始鍊錶時,將當前節點插入新鍊錶的頭部,使其稱為第乙個節點,

鍊錶的操作需要維護後繼關係,例如在某個節點node1之後插入乙個節點node2,我們可以通過修改後繼關係來實現。

node3 = node1.next;

node2.next = node3;

node1.next = node2;

為了能將乙個節點插入頭部,我們引入了乙個叫頭結點的輔助節點,該節點不儲存值,只是為了方便進行插入操作。不要將頭結點與第乙個節點混起來,第乙個節點是鍊錶中第乙個真正儲存值的節點。
//頭插法

public

int[

]reverseprint

(listnode head)

int[

] arr =

newint

[size]

; head = node.next;

int i =0;

while

(head != null)

return arr;

}

劍指 4 從頭到尾列印鍊錶

輸入乙個鍊錶,按鍊錶從尾到頭的順序返回乙個arraylist。法一 使用棧,先進後出 struct listnode class solution int n stk.size for int i 0 i方法二 vectorresult while head null return vector r...

go 劍指offer06 從頭到尾列印鍊錶

題目描述 輸入乙個鍊錶的頭節點,從尾到頭反過來返回每個節點的值 用陣列返回 示例 1 輸入 head 1,3,2 輸出 2,3,1 限制 0 鍊錶長度 10000 我的解題思路 遍歷鍊錶,將其值全部放到陣列內,再反轉陣列 func reverseprint head listnode int var...

從頭到尾列印鍊錶

輸入乙個鍊錶的頭節點,從尾到頭反過來返回每個節點的值 用陣列返回 題目描述了乙個先進後出的結構,很容易想到棧,進而想到遞迴,遞迴也可以實現先進後出,只要將本節點的操作置於遞迴之後即可。棧 definition for singly linked list.public class listnode ...