1. 程式人生 > >從尾到頭列印連結串列(Java)

從尾到頭列印連結串列(Java)

題目:

輸入一個連結串列的頭結點,從尾到頭反過來打印出每個結點的值。

連結串列的結點定義如下:

struct ListNode{
	int m_nKey;
	ListNode* m_pNext;
}

第一思路:

我的第一思路是從頭到尾輸出類比陣列那樣,於是乎想把連結串列中的連結串列結點的指標反轉過來,改變連結串列的方向,然後實現從頭到尾輸出(結果為從尾到頭輸出),可是發現修改連結串列的指標,反轉連結串列的結構比較麻煩。於是乎放棄。(改變連結串列的方向也是需要遍歷一次連結串列然後修改每個連結串列的指標域)

最優解思路:

藉助於棧:我們從頭到尾遍歷連結串列,可以把遍歷的結果放入棧中(先進後出),這樣輸出棧就實現了從尾到頭輸出連結串列元素。

public static void printListReversinglyByStack(ListNode listNode){
	if(listNode == null){ //如果為空,直接返回
		return;
	}
	Stack<Integer> stack = new Stack<Integer>(); //藉助於棧
	while(listNode!=null){
		stack.push(listNode.data); //將資料放入棧中
		listNode = listNode.next; //指標域指向下一個指標
	}
	while(!stack.isEmpty()){ 
		System.out.print(stack.pop() + " "); //藉助於棧輸出
	}
}

藉助於遞迴:因為棧的本質就是一個遞迴,所以遞迴也可以實現連結串列倒著輸出,即每訪問到一個結點的時候,先遞迴輸出它後面的結點,再輸出該結點自身,這樣連結串列的結果就反過來了。

public static void printListReverseinglyByRecursion(ListNode listNode){
	if(listNode!=null){
		if(listNode.next!=null){
			printListReverseinglyByRecursion(listNode.next);
		}
		System.out.print(listNode.data + " ");
	}		
}

遞迴的小問題:當連結串列非常長時,就會使遞迴的層級很深,從而有可能導致函式呼叫棧溢位。顯示用棧基於迴圈實現程式碼的魯棒性要好一些。

測試:

public static void main(String[] args) {
	ListNode ln1 = new ListNode();
	ListNode ln2 = new ListNode();
	ListNode ln3 = new ListNode();
	ListNode ln4 = new ListNode();
	ListNode ln5 = new ListNode();
	ListNode ln6 = new ListNode();
	ListNode ln7 = new ListNode();
	ListNode ln8 = new ListNode();
	ln1.next = ln2;
	ln2.next = ln3;
	ln3.next = ln4;
	ln4.next = ln5;
	ln5.next = ln6;
	ln6.next = ln7;
	ln7.next = ln8;
	ln8.next = null;
	ln1.data = 1;
	ln2.data = 2;
	ln3.data = 3;
	ln4.data = 4;
	ln5.data = 5;
	ln6.data = 6;
	ln7.data = 7;
	ln8.data = 8;
    	//ListNode ln1 = new ListNode();
	//ln1=null;
	printListReversinglyByStack(ln1);
	System.out.println();
	printListReverseinglyByRecursion(ln1);
		
}

小結:

考查隊單項鍊表的理解和程式設計能力;

考查對迴圈、遞迴、棧的理解及應用。

相關推薦

[劍指offer] 到頭列印連結串列Java

題目描述 輸入一個連結串列,按連結串列值從尾到頭的順序返回一個ArrayList。 思路:從頭到尾把值輸入到棧裡面,然後出棧;或者用遞迴的方法;或者Collections的reverse()反轉list值 public class ListNode{ int val; L

到頭列印連結串列Java

題目:輸入一個連結串列的頭結點,從尾到頭反過來打印出每個結點的值。連結串列的結點定義如下:struct ListNode{ int m_nKey; ListNode* m_pNext; }第一思路:我的第一思路是從頭到尾輸出類比陣列那樣,於是乎想把連結串列中的連結串列結點

劍指offer之到頭列印連結串列JAVA

題目描述輸入一個連結串列,從尾到頭列印連結串列每個節點的值。解題思路方法一:藉助堆疊的“後進先出”結構/** *    public class ListNode { *        int val; *        ListNode next = null; * *  

劍指offer之到頭列印連結串列Java實現

從尾到頭列印連結串列 NowCoder 題目描述: 輸入一個連結串列,按連結串列值從尾到頭的順序返回一個ArrayList。 ###解題思路: 解法一:利用遞迴 import java.util.ArrayList; public class Solution {

到頭列印連結串列java

【題目描述】輸入一個連結串列,從尾到頭列印連結串列每個節點的值。 【解題思路1】 //1. 遍歷連結串列,使用一個ArrayList儲存各個連結串列結點。 //2. 將ArrayList關於對稱中心,進行翻轉。得到的ArrayList即為從尾到頭列印的

劍指offer面試題6:到頭列印連結串列Java實現

題目:輸入一個連結串列的頭結點,從尾到頭反過來打印出每個結點的值。 思路:因為要實現從頭到尾遍歷,然後從尾到頭列印,也就是說第一個遍歷到的最後一個列印,最後遍歷到的第一個列印,這很明顯符合棧 “先進後出” 的特點,所以我們可以利用棧來實現這種順序。 測試用例: 功能測試:

牛客網 劍指offer_程式設計題—— 到頭列印連結串列C++

輸入一個連結串列,按連結串列值從尾到頭的順序返回一個ArrayList。 C++ /** * struct ListNode { * int val; * struct ListNode *next; * ListNode(int x) : *

劍指offer之到頭列印連結串列Python

題目描述 輸入一個連結串列,從尾到頭列印連結串列每個節點的值。 思路:寫實現函式比較簡單,主要是利用python的列表實現。初始化列表lists之後,我們讓listNode從頭開始走,每走一步就用append將列表的值新增進列表lists中,直至連結串列的指標指向

JAVA實現到頭列印連結串列《劍指offer》

最近在刷《劍指offer》裡的程式設計題,但是網上關於《劍指offer》的解答多半是C或者C++的,而且官方(作者)也是在用C++進行講解,這裡自己用java寫了一些題目的解答程式碼(當然也有部分是借

劍指offer-到頭列印連結串列連結串列

題目描述 輸入一個連結串列,按連結串列值從尾到頭的順序返回一個ArrayList。 連結串列中當前節點q的next指標本來指向的是後一個節點,現在要令他指向前一個節點p(在此之前用r存下q的後一個節點)。 /** * struct ListNode { * int val

C++到頭列印連結串列劍指offer面試題6

下面是PrintListInReversedOrder.h檔案,利用兩種方法 // 面試題6:從尾到頭列印連結串列 // 題目:輸入一個連結串列的頭結點,從尾到頭反過來打印出每個結點的值。 #include<iostream> #includ

【劍指Offer】到頭列印連結串列連結串列的逆序輸出

目錄 題目描述 題目描述 輸入一個連結串列,按連結串列值從尾到頭的順序返回一個ArrayList。 解法一:使用棧 單向連結串列的逆序輸出,我們可以很容易的想到使用一個棧作為輔助,棧的先進後出的特效能幫到我們大忙。(所以基礎的資料結構是真的很重要)

【劍指Offer】到頭列印連結串列C++,棧/遞迴

題目連結 題目描述 輸入一個連結串列,從尾到頭列印連結串列每個節點的值。 思路:從尾到頭列印,符合後進先出,用棧儲存,然後存入vector.O(n) 另外,遞迴本質也是棧結構,所以也可以用遞迴寫。 程式碼【棧】: /** * struct List

劍指offer面試題5 從頭到尾列印連結串列java

注:(1)這裡體現了java資料結構與C語言的不同之處 (2)棧的操作直接利用stack進行 1 package com.xsf.SordForOffer; 2 3 import java.u

劍指Offerjava+第五題,到頭列印連結串列

思路:藉助棧實現,或使用遞迴的方法。 程式碼實現: import java.util.ArrayList; import java.util.Stack; //定義連結串列結構,如果這部分程式碼放到類Offer05裡面就會報錯;如果非把ListNode放到類Offer05裡面就要在clas

劍指offer——6到頭列印連結串列&&反轉連結串列&&連結串列倒數第K個結點

/** * public class ListNode { * int val; * ListNode next = null; * * ListNode(int val) { * this.val = val; *

牛客66題3到頭列印連結串列

輸入一個連結串列,按連結串列值從尾到頭的順序返回一個ArrayList。 思路:很簡單,設定一個棧,遍歷連結串列將連結串列依次壓棧,最後依次彈出。 class Solution { public: vector<int> printListFromTailToHead(L

簡單的演算法1--到頭列印連結串列

目錄 1、java實現 1.1、遞迴 1.1.1、測試(完整原始碼) 1.2、利用棧來實現 1.2.1、測試 2、C語言 2.1、先將連結串列反轉,再從頭輸出(改變連結串列的結構) 2.2、利用棧的“先進後出”特性   1、java實現 連結

劍指offer5到頭列印連結串列java

1.用棧來實現,先把listnode.val全部放進自己的棧裡,然後列印棧的值 /** * public class ListNode { * int val; * ListNode next = null; * * List

5.到頭列印連結串列(Java)

從尾到頭列印連結串列 題目描述 輸入一個連結串列,按連結串列值從尾到頭的順序返回一個ArrayList。 具體實現: 解法一: 解題思路:有點浪費空間的做法,需要建立兩個ArrayList物件, 用list來儲存連結串列中從頭到尾的資料,再把lis