輸入乙個鍊錶的頭節點,從尾到頭反過來返回每個節點的值(用陣列返回)。th:逆序列印 我們可以將鍊錶loop一遍,push到棧中。然後pop出 因為棧是先進後出 所有最後順序就是逆序的順序。 這裡建議push最好是val push node的話 占用的記憶體空間比較大。示例 1:
輸入:head = [1,3,2]
輸出:[2,3,1]
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 ...