解法一,递归打印O(n)
思路:链表和树很像,很容易联想到树的常用解法递归,对第一个节点,先输出其next值再输出本身值,最后变成了tail最先输出,head最后输出。如果链表过长,递归会造成栈溢出,这种方法就不合适了。
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
return printTtoH(new ArrayList<Integer>(), listNode);
}
ArrayList<Integer> printTtoH(ArrayList<Integer> printSeq, ListNode listNode) {
if(listNode == null){
return printSeq;
}
printSeq = printTtoH(printSeq, listNode.next);
printSeq.add(listNode.val);
return printSeq;
}
解法二,用栈存储被打印序列O(n)
逆向打印整个链表,而给定的是链表的head,而且链表是单向链表,只有next指针,无可避免,需要正序访问链表。而有一种数据结构,先进后出,栈。将链表的整个值序列存储在栈中,再依次pop输出,则变成从尾到头打印链表。这种解法相对于第一种稳定性更好,虽然会多一次循环。