題目:輸入一個鏈表的頭結點,從尾到頭反過來打印出每一個節點的值。java
從頭至尾輸出比較簡單,能夠把鏈表中的節點的指針反轉過來,改變鏈表的方向,而後就能夠從頭至尾輸出了。但該方法改變原來鏈表的結構。是否容許在打印鏈表的時候修改鏈表 的結構?這個取決於面試官的要求,所以在面試的時候咱們要詢問清楚面試官的要求。node
一般打印是一個只讀操做,咱們不但願打印時修改內容。假設面試官也要求這個題目不能改變鏈表的結構。面試
接下來咱們想到解決這個問題確定要遍歷鏈表。遍歷的順序是從頭至尾的 順序,可輸出的順序倒是從尾到頭。也就是說第一個遍歷的節點最後一個輸出,而最後一個遍歷到的節點第一個輸出。這就是典型的'後進先出「,咱們能夠從棧實 現這種順序。每通過一個節點的時候,把該節點放到一個棧中。當遍歷完整的鏈表後,再從棧頂開始逐個輸出節點的值,此時輸出的節點的順序已經反轉過來了。函數
既然想到了用棧來實現這個函數,而遞歸在自己上就是一個棧結構,因而天然就想到了用遞歸來實現。要實現反過來輸出鏈表,咱們每訪問到一個節點的時候,先遞歸輸出後面的 節點,再輸出該節點自己,這樣鏈表的輸出結果就反過來了。this
package cglib;指針
import java.util.Stack;遞歸
class ListNode {
public int data;
public ListNode nextNode;
public ListNode() {
}
public ListNode(int data) {
this.data = data;
}
}
public class List1
{
public static void main (String args[])
{
ListNode node1=new ListNode();
ListNode node2=new ListNode();
ListNode node3=new ListNode();
node1.data=1;
node2.data=2;
node3.data=3;
node1.nextNode=node2;
node2.nextNode=node3;
//List1 test0=new List1();
//List1.printListReverse(node1);
//List1 test1=new List1();
//test1.printListReverseStack(node1);
printListReverse(node1);
printListReverseStack(node1);
}
// 採用遞歸調用的方法
public static void printListReverse(ListNode headNode){
if(headNode!=null){
if(headNode.nextNode!=null){
printListReverse(headNode.nextNode);
}
}
System.out.println(headNode.data);
}
// 採用棧--先進後出的方法
public static void printListReverseStack(ListNode headNode){
Stack<ListNode> stack=new Stack<ListNode>();
while(headNode!=null){
stack.push(headNode);
headNode=headNode.nextNode;
}
while(!stack.isEmpty()){
System.out.println(stack.pop().data);
}
}
} class
輸出:test
3
2
1
3
2
1import