劍指 Offer 06 從尾到頭列印鍊錶

2021-10-08 13:48:05 字數 1723 閱讀 5801

題目描述:

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

示例:

輸入: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 用來儲存從棧中彈出的值...