题目:输入一个链表的头结点,从尾到头反过来打印出每个节点的值.
用Java定义的链表的数据结构:
class ListNode{
int val;
ListNode next;
public ListNode(int val){
this.val = val;
}
}
分析:
那就直接遍历单链表,然后把每个节点的值都存起来然后倒序输出即可.
这个题目使用栈来作为中间件刚刚好,因为栈是先进后出的.
或者利用数组也可以,输出的时候控制下标就行.
class JZ6{
public static void printListFromTailToHead(ListNode listNode) {
//创建一个栈
Stack<Integer> stack = new Stack<>();
//指针直接指向 头结点
ListNode p = listNode;
while(p!=null){//p的指向不为空则继续遍历.
stack.push(p.val);//将每个节点的值压入栈中
p=p.next;
}
while(!stack.empty()){
//栈不为空,就把栈打印空
System.out.println(stack.pop());
}
}
}
既然能用栈,那就很容易想到递归.
但是系统这样有一个问题,就是如果链表过长,会导致系统栈溢出.因此还是上面的那个代码性能更加稳定.
public static void digui(ListNode head){
if(head!=null){
digui(head.next);
System.out.println(head.val);
}
}