面試題6 從尾到頭列印鍊錶

2022-09-08 00:18:18 字數 1853 閱讀 7017

題目描述:

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

題解1:遞迴。遞迴終止條件:head = null,意味著遍歷到了鍊錶的尾部,同時也意味著,可以回溯遞迴的值。

第一次遞迴:recur(1)->recur(3)

第二次遞迴:recur(3)->recur(2)

第三次遞迴:recur(2)->null;

此時進行回溯:將值新增到陣列中

第一次回溯:add(2)

第二次回溯:add(3)

第三次回溯:add(1)

最後列印陣列即從尾到頭遍歷了鍊錶,因為是將鍊錶的值儲存陣列中,所以並未改變原鍊錶的狀態。

時間複雜度o(n):遍歷鍊錶,遞迴n次

空間複雜度o(n):系統遞迴呼叫需要o(n)的空間

//

遞迴 arraylisttemp = new arraylist<>();

public

int reverseprint(listnode head)

return

res;

}/*一直遞迴到null結束,結束後的值是null的前乙個值,也就是陣列的最後乙個值。

*/public

void

recur(listnode head)

recur(head.next);

temp.add(head.val);

}

題解二:利用棧

從尾到頭列印完美符合棧的特點:先進後出

將元素依次入棧再依次出棧即可,j**a中可以使用linkedlist實現棧。

入棧:addlast將元素新增到列表末尾。

出棧:removelast刪除並返回列表尾最後乙個元素(不能使用getlast,因為getlast會一直返回表尾最後乙個,返回的都是同乙個元素)

時間複雜度o(n):入棧和出棧使用o(n)時間

空間複雜度o(n):額外棧和陣列共使用o(n)空間

//

輔助棧方法

public

int reverseprint(listnode head)

int res = new

int[stack.size()];

for (int i =0 ;i)

return

res;

}

解法三:

遍歷一遍鍊錶,記錄鍊錶中元素的數量。

建立乙個陣列,以煉表中的元素數量為大小,同時從元素數量-1索引處開始迴圈,向陣列中從後往前新增鍊錶元素的值。

時間複雜度:遍歷鍊錶和遍歷陣列新增元素各占用o(n),時間複雜度為o(n)

空間複雜度:o(1),不需要額外空間

public

class

solution3

int arr = new

int[count];

temp =head;

//從後往前 新增到陣列中

for (int i = count - 1; i >=0 ; i--)

return

arr;}}

參考題解:

面試題6 從尾到頭列印鍊錶

一 題目 輸入乙個鍊錶的頭結點,從尾到頭反過來列印出每個結點的值。二 關鍵 後進先出 的例子,因此可以使用棧 遞迴來實現功能。三 解釋 四 其他方法 把鍊錶中的指標反轉過來。使用兩個指標,p1和p2,p1的初始值是表頭,p2的初始值是p1 next,只要p2 null,那麼就進行p1 next p2...

面試題6 從尾到頭列印鍊錶

輸入乙個鍊錶的頭節點,從尾到頭反過來列印出每個節點的值。鍊錶節點定義如下 struct listnode 從尾到頭列印,能否改變原來的鍊錶?是否允許修改輸入資料 1.能改變原來的鍊錶,將鍊錶的指標反過來。2.使用棧 遞迴 插入節點 在鍊錶的尾端插入乙個節點 若煉表為空,則頭指標的值會改變 所以要使用...

面試題6 從尾到頭列印鍊錶

輸入乙個鍊錶,按鍊錶從尾到頭的順序返回乙個arraylist。占用記憶體 9572k public arraylist printlistfromtailtohead02 listnode listnode stack stack newstack listnode p listnode while...