https://www.nowcoder.com/practice/d0267f7f55b3412ba93bd35cfa8e8035?tpId=13&tqId=11156&tPage=1&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking
解法一
使用栈。逆序输出和先入后出的结果一样,把链表的节点依次入栈再出栈即可。
import java.util.ArrayList; import java.util.Stack; public class Solution { public ArrayList<Integer> printListFromTailToHead(ListNode listNode) { Stack<Integer> stack = new Stack<>(); ArrayList<Integer> list = new ArrayList<>(); while (listNode!=null){ stack.add(listNode.val); listNode = listNode.next; } while (!stack.isEmpty()){ list.add(stack.pop()); } return list; } }
解法二
头插法重新建立链表。这种方法的好处是节省了空间,不需要额外的栈空间的开销。
遍历原始链表,对每一个节点用头插的方式放到新的链表里。具体的在循环的过程中,先用一个temp节点保存正在修改节点的后续节点,这样正在修改的节点就可以放心大胆的改变其next。
public ArrayList<Integer> printListFromTailToHead(ListNode listNode){ ListNode head = new ListNode(-1); ListNode temp; while (listNode != null){ temp = listNode.next; listNode.next = head.next; head.next = listNode; listNode = temp; } ArrayList<Integer> list = new ArrayList<>(); head = head.next; while (head!=null){ list.add(head.val); head = head.next; } return list; }