[程式設計題]從尾到頭列印連結串列 牛客網練習 java遞迴
連結:https://www.nowcoder.com/questionTerminal/d0267f7f55b3412ba93bd35cfa8e8035?answerType=1&f=discussion
來源:牛客網
[程式設計題]從尾到頭列印連結串列
- 熱度指數:1468661 時間限制:C/C++ 1秒,其他語言2秒 空間限制:C/C++ 32M,其他語言64M
- 演算法知識視訊講解
輸入一個連結串列,按連結串列從尾到頭的順序返回一個ArrayList。
示例1
輸入
{67,0,24,58}
輸出
[58,24,0,67]
分析:
這裡面其實不是什麼難點,就是一個連結串列逆序的問題。
然後我主要是我為了增加自己的演算法熟練度的,所以更多的時候是使用自己不熟練的方案。所以會有優化版本,如果我沒有寫出來,各位大佬可以評論區教一下!!!
/**
*方法一:遞迴實現,定義一個遞迴函式,完成遞迴即可。
* 注意判斷為空連結串列的情況即可
*/
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
ArrayList<Integer> result = new ArrayList<>();
if (listNode != null){
backout(result, listNode);
}
return result;
}
private void backout(ArrayList<Integer> result, ListNode listNode) {
if (listNode.next != null) {
backout(result, listNode.next);
result.add(listNode.val);
} else {
result.add(listNode.val);
return;
}
}
/**
* 方法二:在外部定義一個返回型別的變數,然後直接利用命題函式實現遞迴。
* 這個方法在我工作以後不是很喜歡用,因為這個成員變數不利於資料的安全性
*/
ArrayList<Integer> list = new ArrayList();
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
if(listNode!=null){
printListFromTailToHead(listNode.next);
list.add(listNode.val);
}
return list;
}
/**
*方法三,利用ArrayList中插入方法的特性,指定對應位置的插入,同時將原資料後移。
* 這個方案一開始我也沒有想到,因為這個對jdk的api用習慣以後有一定的慣性思維。
* 後面我貼出add方法的api說明:
* Inserts the specified element at the specified position in this
* list. Shifts the element currently at that position (if any) and
* any subsequent elements to the right (adds one to their indices).
*/
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
ArrayList<Integer> list = new ArrayList<>();
ListNode tmp = listNode;
while(tmp!=null){
list.add(0,tmp.val);
tmp = tmp.next;
}
return list;
}
相關文章
- 劍指offer(java實現)第3題“從尾到頭列印連結串列”-牛客網Java
- [每日一題] 第九題:從尾到頭列印連結串列每日一題
- 劍指Offer面試題5(Java版):從尾到頭列印連結串列面試題Java
- 劍指offer-從尾到頭列印連結串列-phpPHP
- 反轉連結串列系列題練習遞迴遞迴
- 單連結串列從尾到頭輸出元素
- 劍指OFFER-從頭到尾列印連結串列(Java)Java
- Java程式設計基礎24——遞迴練習Java程式設計遞迴
- 演算法學習記錄三(C++)--->從尾到頭列印連結串列每個節點的值演算法C++
- Golang從合併連結串列聊遞迴Golang遞迴
- java常見遞迴練習題Java遞迴
- 牛客網字串排序程式設計題字串排序程式設計
- Mysql 練習(牛客網)MySql
- 連結串列面試題(一)---刪除一個無頭單連結串列的非尾結點面試題
- 函數語言程式設計之尾呼叫和尾遞迴函數程式設計遞迴
- 遞迴演算法-不帶頭節點的單連結串列遞迴演算法
- 牛客題霸NC132環形連結串列的約瑟夫問題Java題解Java
- 牛客SQL練習第21題SQL
- 牛客網高頻演算法題系列-BM13-判斷一個連結串列是否為迴文結構演算法
- 牛客網高頻演算法題系列-BM11-連結串列相加(二)演算法
- 牛客網高頻演算法題系列-BM1 反轉連結串列演算法
- 連結串列-迴圈連結串列
- Java學習之for迴圈列印菱形練習Java
- Java演算法面試題(001) 如何使用迴圈和遞迴計算單連結串列的長度Java演算法面試題遞迴
- Java解釋單連結串列中的頭插法以及尾插法Java
- 遞迴和尾遞迴遞迴
- 【資料結構】遞迴實現連結串列逆序資料結構遞迴
- 牛客網高頻演算法題系列-BM12-單連結串列的排序演算法排序
- 牛客網高頻演算法題系列-BM14-連結串列的奇偶重排演算法
- 連結串列4: 迴圈連結串列
- 牛客網高頻演算法題系列-BM7-連結串列中環的入口結點演算法
- 詳細分析連結串列中的遞迴性質(Java 實現)遞迴Java
- C++單連結串列遞迴遍歷操作C++遞迴
- 單連結串列逆置遞迴演算法遞迴演算法
- 設計單向迴圈連結串列的介面
- 頭插法和尾插法建立連結串列區別
- 牛客網Java評估題Java
- 【程式碼隨想錄】二、連結串列:2、設計連結串列