题目描述:
输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。
分析:
其实就是如何将链表从尾到头到尾放入链表集合的问题。可以借助栈但是会增加额外的空间复杂度O(N),所以从节省空间复杂度层次来说,原地逆转链表然后再将逆转后的链表从表头依次放入list集合中即可。该方法所需的空间复杂度为O(1),时间复杂度为O(N)。
代码实现如下:
public class Solution {
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
ArrayList<Integer> arrlist = new ArrayList<>();
//先反转链表
ListNode pre = null;
ListNode next = null;
while(listNode != null){
next = listNode.next;
listNode.next = pre;
pre = listNode;
listNode = next;
}
//逆转完成后,这时pre指向的是新链表的表头位置。
ListNode head = pre;
while(head !=null){//将节点的依次放入list集合中。
arrlist.add(head.val);
head = head.next;
}
return arrlist;
}
}
其实本题还可以用递归的方法实现,参考牛客网上的某位大佬的解法: