題目
從尾到頭打印鏈表
輸入一個鏈表,從尾到頭打印鏈表每個節點的值。
解答
思路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;
}
}
*/