從尾到頭打印鏈表

從尾到頭打印鏈表

題目

輸入一個鏈表的頭結點,從尾到頭反過來打印出每個結點的值

思路
思路1:將鏈表反轉,再從頭遍歷輸出
思路2:從頭遍歷鏈表並壓棧,再打印棧數據
思路3:遞歸,從尾到頭打印

實現代碼

//思路1,反轉鏈表
//改變鏈表結構,將指針反轉
public static ListNode reverse1(ListNode headNode){
    if(headNode == null)
        return null;
    ListNode pre = null;
    while(headNode != null){
        ListNode tmp = headNode.next;       //找出下一位
        headNode.next = pre;                //吧當前的指針指向前面
        pre = headNode;                     //向後移動繼續
        headNode = tmp;
    }
    return pre;             //pre爲新鏈表的head結點
}
思路2
//不改變鏈表結構,壓入棧中
public static ListNode reverse2(ListNode headNode){
    Stack<ListNode> stack = new Stack<ListNode>();      //創建棧
    while(headNode.next != null){       //吧結點壓入棧(最後一個結點沒壓)
        stack.push(headNode);
        headNode = headNode.next;
    }

    ListNode newHeadNode = headNode;    //指向最後一個結點

    while(!stack.empty()){          //出棧
        headNode.next= stack.pop();
        headNode = headNode.next;
    }
    headNode.next = null;
    return newHeadNode;
}
思路3
//遞歸
public static ListNode reverse3(ListNode headNode){
    if(headNode == null || headNode.next == null)
        return headNode;
    ListNode newHeadNode = reverse3(headNode.next);
    headNode.next.next = headNode;
    headNode.next = null;
    return newHeadNode;
}

測試用例

public static void main(String[] args) {
    //構建測試鏈表
    ListNode headNode = new ListNode(1);
    ListNode node1 = new ListNode(2);
    ListNode node2 = new ListNode(3);
    ListNode node3 = new ListNode(4);
    ListNode node4 = new ListNode(5);
    headNode.next = node1;
    node1.next = node2;
    node2.next = node3;
    node3.next = node4;
    node4.next = null;

    ListNode reverseListNode = reverse3(headNode);
    //打印
    while(reverseListNode != null){
        System.out.println(reverseListNode.node_value);
        reverseListNode = reverseListNode.next;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章