輸入一個鏈表的頭節(jié)點,從尾到頭反過來返回每個節(jié)點的值(用數(shù)組返回)输硝。
- 示例 :
輸入:head = [1,3,2]
輸出:[2,3,1]
限制:0 <= 鏈表長度 <= 10000
- 解題思路:
1.利用棧
遍歷鏈表绸狐,遍歷的順序是從頭到尾室抽,可輸出的順序卻是從尾到頭;也就是說第一個遍歷到的節(jié)點最后一個輸出国裳,而最后一個遍歷到的節(jié)點第一個輸出煮甥。這個就是典型的后進先出盗温,我們可以用棧來實現(xiàn)這種順序,每經(jīng)過一個節(jié)點的時候成肘,把該節(jié)點放到一個棧中卖局,當遍歷完整個鏈表后,再從棧頂開始依次輸出節(jié)點的值
2.利用遞歸
既然想到了用棧双霍,而遞歸本質(zhì)上就是一個棧結構砚偶,要實現(xiàn)反過來輸出鏈表,每訪問到一個節(jié)點的時候洒闸,先遞歸輸出它后面的節(jié)點染坯,再輸出該節(jié)點自身,這樣鏈表的輸出結果就反過來了
3.unshift() / reverse()
遍歷鏈表丘逸、將每個元素從數(shù)組頭部插入单鹿、實現(xiàn)倒序輸出
方法一:利用棧
/**
* Definition for singly-linked list.
* function ListNode(val) {
* this.val = val;
* this.next = null;
* }
*/
/**
* @param {ListNode} head
* @return {number[]}
*/
var reversePrint = function(head) {
var nodes=[];
while(head!=null){
nodes.push(head.val);
head=head.next;
}
let result=[];
let temp = nodes.pop();
while (temp != null) {
result.push(temp);
temp = nodes.pop();
}
return result;
};
方法二:利用遞歸
/**
* Definition for singly-linked list.
* function ListNode(val) {
* this.val = val;
* this.next = null;
* }
*/
/**
* @param {ListNode} head
* @return {number[]}
*/
var reversePrint = function(head, arr = []) {
// 利用函數(shù)遞歸棧的特性
if (head != null) {
if (head.next != null) {
reversePrint(head.next, arr);
}
arr.push(head.val);
}
return arr;
};
方法三:利用JS的reverse()或unshift()方法
/**
* Definition for singly-linked list.
* function ListNode(val) {
* this.val = val;
* this.next = null;
* }
*/
/**
* @param {ListNode} head
* @return {number[]}
*/
var reversePrint = function(head) {
var nodes=[];
while(head!=null){
nodes.push(head.val);
head=head.next;
}
return nodes.reverse();
}
//或
var reversePrint = function(head) {
var nodes=[];
while(head!=null){
nodes.unshift(head.val);
head=head.next;
}
return nodes;
}
注:unshift() 方法將新項添加到數(shù)組的開頭,并返回新的長度深纲。