【劍指offer】【3】輸入一個連結串列,從尾到頭列印連結串列每個節點的值。

love_Aym發表於2018-06-06

題目:輸入一個連結串列,從尾到頭列印連結串列每個節點的值。


知識補充:java Stack類(菜鳥教程)

棧是Vector的一個子類,它實現了一個標準的後進先出的棧。

堆疊只定義了預設建構函式,用來建立一個空棧。 堆疊除了包括由Vector定義的所有方法,也定義了自己的一些方法。

Stack()

除了由Vector定義的所有方法,自己也定義了一些方法:

序號方法描述
1boolean empty() 
測試堆疊是否為空。
2Object peek( )
檢視堆疊頂部的物件,但不從堆疊中移除它。
3Object pop( )
移除堆疊頂部的物件,並作為此函式的值返回該物件。
4Object push(Object element)
把項壓入堆疊頂部。
5int search(Object element)
返回物件在堆疊中的位置,以 1 為基數。

思路一:使用棧結構來實現

//定義連結串列
    public class ListNode {
        int val;
        ListNode next = null;

        ListNode(int val) {
            this.val = val;
        }
   }


import java.util.ArrayList;
import java.util.Stack;
public class Solution {
    public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
        Stack stack = new Stack();  
        ArrayList newlist = new ArrayList();
        
        if(listNode == null){
            System.out.println("連結串列為空!");
        }
        
        while(listNode != null){
            stack.push(listNode.val);
            listNode = listNode.next;
        }
        
        while(!stack.empty()){
             newlist.add(stack.pop());
        }
        
        return newlist;
    } 
}

思路:在不改變連結串列的前提下,遍歷連結串列同時進行入棧操作存入棧中,然後進行出棧操作並存入ArrayList中。

棧:先進後出,正好符合本題的意思。


初次接觸的疑惑總結:

  • 類中可以有該類作為變數型別的成員變數,只是不能進行new物件而已,不然就像一個死迴圈一樣永無止境,但是可以宣告。
  • 這裡定義連結串列時,連結串列元素中包含有下一個元素的地址,next就為指向下一個連結串列元素的地址值。
  • listNode.next :和正常呼叫成員變數是一樣的,next為地址值
  • listNode == null:判斷下一個連結串列元素的地址值是否為空


思路二:使用Collections的reverse()方法,直接將list反轉

import java.util.ArrayList;
import java.util.Collections;
public class Solution {
    public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
        ArrayList<Integer> list = new ArrayList<Integer>();
         
        while(listNode != null){
            list.add(listNode.val);
            listNode = listNode.next;
        }
         
        Collections.reverse(list);
        return list;
    }
}


思路三:使用遞迴,遞迴的本質是棧結構(若元素比較多,導致函式呼叫層級也深,可能導致函式呼叫棧溢位)

public class Solution {
    ArrayList<Integer> arrayList=new ArrayList<Integer>();
    public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
        if(listNode!=null){
            this.printListFromTailToHead(listNode.next);
            arrayList.add(listNode.val);
        }
        return arrayList;
    }
}  


相關文章