输入一个链表,从尾到头打印链表每个节点的值。一共有三种方法,第一种方法为我自己的方法,另外两种参考其他人的,分别为利用栈和利用递归。
/**
* public class ListNode {
* int val;
* ListNode next = null;
*
* ListNode(int val) {
* this.val = val;
* }
* }
*
*/
第一种方法:
public static ArrayList<Integer> printTailToHead1(ListNode listNode)
{
//定义一个变量来累计链表的节点数
int num = 1;
ArrayList<Integer> a = new ArrayList<Integer>();
//累计节点数并将值加入集合
while(listNode != null)
{
a.add(listNode.val);
listNode = listNode.next;
num ++;
}
//头尾交换,讲集合里的节点倒序
for(int i = a.size() - 1,j = 0;i > j;j ++,i --)
{
int temp = a.get(i);
a.set(i, a.get(j));
a.set(j, temp);
}
return a;
}
方法2:利用栈
public static ArrayList<Integer> printTailToHead2(ListNode listNode)
{
//初始化一个栈,需要导入包java.util.stack
Stack<Integer> stack = new Stack<Integer>();
ArrayList<Integer> list = new ArrayList<Integer>();
//将节点一次加入到栈
while(listNode != null)
{
stack.add(listNode.val);
//讲节点后移
listNode = listNode.next;
}
//将节点从栈中取出,依次插入list
while(!stack.isEmpty())
{
list.add(stack.pop());
}
return list;
}
方法3:递归
public static ArrayList<Integer> printTailToHead2(ListNode listNode)
{
ArrayList<Integer> list = new ArrayList<Integer>();
//判断节点是否为空
if(listNode != null)
{
//判断下一个节点是否为空,为空则以下一个节点为参数递归
if(listNode.next != null)
{
list = printTailToHead2(listNode.next);
}
//最开始执行这条语句一定是最后一个节点
list.add(listNode.val);
}
return list;
}