题目:输入一个链表的头结点,从尾到头反过来打印每个节点的值.
分析1:
通常,打印是一个只读操作,我们不希望打印的同时去修改原数据的内容.故我们不能改变链表的结构.解决这个问题肯定是需要遍历链表的,但是遍历的顺序是从头到尾的,可输出的顺序确实从尾到头,也就是说第一个遍历到的节点最后一个输出,最后一个遍历到的节点第一个输出. 这是典型的”先进后出“,我们可以利用栈来实现这种顺序;
代码1:
/*
*链表的数据结构
*/
class ListNoede{
int value;
ListNode next=null;
ListNode(int value){
this.value=value;
}
}
/*
*具体实现类
*/
public class Solution{
public ArrayList<Integer> printListFromTailToHead(ListNoede listNode){
Stack<Integer>stack=new Stack<Intger>();
while(listNode!=null){
stack.push(listNode.value);//入栈操作
listNode=listNode.next;
}
ArrayList<Integer>arrayList=new ArrayList<Integer>();
//注意此处遍历栈的方法
while(!stack.isEmpty()){
arrayList.add(stack.pop());//出栈操作,并添加到List集合中
}
return arrayList;
}
}
/*
*测试代码
*/
public class carry {
public static void main(String[] args) {
ListNode listNode1 = new ListNode(1);
ListNode listNode2 = new ListNode(2);
ListNode listNode3 = new ListNode(3);
ListNode listNode4 = new ListNode(4);
ListNode listNode5 = new ListNode(5);
Solution solution = new Solution();
listNode1.next=listNode2;
listNode2.next=listNode3;
listNode3.next=listNode4;
listNode4.next=listNode5;
listNode5.next=null;
ArrayList<Integer> tailToHeadList = solution.printListFromTailToHead(listNode1);
for (Integer integer : tailToHeadList) {
System.out.println(integer);
}
}
}
输出结果:5 4 3 2 1
分析2:
根据分析1中的栈结构,可以联想到,递归在本质上就是一个栈结构,于是也可以用递归来实现; 我们每访问到一个节点的时候,首先输出它后面的节点,再输出其本身的节点,这样链表的结构就反过来输出了.
代码2:
class Solution{
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
ArrayList<Integer> list=new ArrayList<Integer>();
ListNode pNode=listNode;
if(pNode!=null){
if(pNode.next!=null){
//递归调用
list=printListFromTailToHead(pNode.next);
}
list.add(pNode.value);
}
return list;
}
}