题目
从尾到头打印链表
输入一个链表,从尾到头打印链表每个节点的值。
解答
思路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;
}
}
*/