題目描述:輸入乙個鍊錶的頭節點,從尾到頭反過來返回每個節點的值(用陣列返回)。
示例:
輸入:head = [1,3,2]
輸出:[2,3,1]
解題思路:1、使用遞迴:
由於題目的要求是從尾開始列印每個節點的值,因此可以先遞迴輸出後面的節點,然後再列印當前節點的值,這樣鍊錶的輸出結果就是反過來的了。
2、使用stack(本質上是遞迴):
使用遞迴的**看起來非常簡潔,但是有乙個問題:當鍊表非常長的時候會導致函式呼叫的層級很深,從而導致函式呼叫棧溢位的情況,因此使用棧來替換遞迴的**魯棒性會好一些。
3、頭插法:
以上的兩種解法是沒有改變鍊錶的結構的解法,如果允許改變鍊錶的結果,則可以利用頭節點將整個鍊錶進行翻轉,然後順序列印煉表中節點的值。
頭節點和第乙個節點的區別:
(1)頭節點是在頭插法中使用的乙個額外節點,這個節點不儲存值;
(2)第乙個節點就是鍊錶的第乙個真正儲存值的節點。
實現**:
public
int[
]arraylisttointarray
(arraylist
list)
public arraylist
reverse
(listnode head)
return arraylist;
}//解法1:使用遞迴
public
int[
]reverseprint1
(listnode head)
//解法2:使用棧(本質上是遞迴)
public
int[
]reverseprint2
(listnode head)
int[
] res =
newint
[stack.
size()
];int i =0;
while
(!stack.
isempty()
)return res;
}//解法3:使用頭插法使鍊錶逆序
public
int[
]reverseprint
(listnode head)
arraylist
list =
newarraylist
<
>()
; newhead = newhead.next;
while
(newhead != null)
int[
] res =
newint
[list.
size()
];for(
int i =
0; i < res.length; i++
) res[i]
= list.
get(i)
;return res;
}
劍指offer06 從尾到頭列印鍊錶
題目 從尾到頭列印鍊錶 思路 1,注意傳入函式的是指向煉表頭的指標,在函式中不應該直接使用這個指標,而是應該用乙個指標的臨時變數來遍歷鍊錶 2,方法一 使用棧來實現 3,方法二 遞迴在本質上就是乙個棧結構,所以也可以用遞迴來實現 solution include include include us...
劍指offer 06 從尾到頭列印鍊錶
輸入乙個鍊錶的頭節點,從尾到頭反過來返回每個節點的值 用陣列返回 示例 1 輸入 head 1,3,2 輸出 2,3,1 限制 0 鍊錶長度 10000 鍊錶特點 只能從前至後訪問每個節點。題目要求 倒序輸出節點值。這種先入後出的需求可以借助棧來實現。通過linkedlist類來實現棧 入棧 遍歷鍊...
劍指 Offer 06 從尾到頭列印鍊錶
題目描述 輸入乙個鍊錶的頭節點,從尾到頭反過來返回每個節點的值 用陣列返回 解題思路 1 在不允許修改鍊錶的結構的條件下,採用棧輔助 2 新建乙個棧,stackstack new stack 將鍊錶的節點依次壓入棧中 新開乙個陣列,int print new int size 用來儲存從棧中彈出的值...