從尾到頭打印鏈表

題目

從尾到頭打印鏈表

輸入一個鏈表,從尾到頭打印鏈表每個節點的值。

解答

思路1:棧結構

鏈表的特性:查找其中某一個結點的時間複雜度是O(n),不像數組那樣可以直接通過下表在O(1)的時間內查找到指定元素。因此如果要查找鏈表元素,我們必須從頭結點開始順序往後查找。現在需要輸出鏈表中的每個結點的值,而必須是從尾到頭的,也就是先遍歷的結點後輸出,一個典型的“先進後出”的數據結構,這就讓我們想到了棧的結構,如果我們在遍歷鏈表的時候,將遍歷的結果存放在一個棧中,遍歷結束以後輸出棧中的元素值,就是我們需要的從尾到頭打印鏈表結點值。

代碼1

Java語言程序,使用棧結構

public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
    ArrayList<Integer> listStack = new ArrayList<Integer>();
    if(listNode == null){
        return listStack;
    }
    Stack<Integer> stack = new Stack<Integer>();
    // 入棧
    while(listNode!=null){
        stack.push(listNode.val);
        listNode = listNode.next;
    }
    // 出棧
    while(!stack.isEmpty()){
        listStack.add(stack.pop());
    }
    return listStack;
}

/*
// 鏈表節點
public class ListNode {
    *int val;
    ListNode next = null;

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

思路2:遞歸算法

遞歸在本質上就是一個棧結構,用遞歸來實現。要實現反過來輸出鏈表,每訪問到一個結點的時候,先遞歸輸出它後面的結點,再輸出該結點自身,這樣鏈表的輸出結構就反過來了。

代碼2

Java語言程序,使用遞歸算法


private ArrayList<Integer> list = new ArrayList<Integer>();

public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
    if(listNode == null){
        return list;
    }
    // 先遍歷
    printListFromTailToHead(listNode.next);
    // 再添加
    list.add(listNode.val);
    return list;
}

/*
// 鏈表節點
public class ListNode {
    *int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}
*/
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章