目录
从尾到头打印链表
描述
输入一个链表的头节点,按链表从尾到头的顺序返回每个节点的值(用数组返回)。
如输入{1,2,3}的链表如下图:
返回一个数组为[3,2,1]
0 <= 链表长度 <= 10000
示例1
输入:
{1,2,3}
返回值:
[3,2,1]
示例2
输入:
{67,0,24,58}
返回值:
[58,24,0,67]
说明
链表的数据结构如下:
public class ListNode {
public int val;
public ListNode next;
public ListNode(int x) {
val = x;
next = null;
}
}
方法一:翻转列表
一开始想到的方法是反转列表,没想到挺慢的,问题想复杂了,
import java.util.ArrayList;
public class Solution {
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
ArrayList<Integer> list=new ArrayList<>();
ListNode head=listNode;
if (listNode==null){
return list;
}else if (listNode.next==null){
list.add(listNode.val);
return list;
}else{
ListNode pre=null;
ListNode cur=head;
ListNode next=head.next;
while(cur!=null){
cur.next=pre;
if (next!=null){
pre=cur;
cur=next;
next=next.next;
}else{
break;
}
}
while(cur!=null){
list.add(cur.val);
cur=cur.next;
}
return list;
}
}
}
方法二:Java的方法
ArrayList. add(index,value)可以将值插入到指定位置,所以利用这个特性,我们遍历链表,将每个节点元素插到第一个位置就可以实现倒置(tips:利用String的reverse函数或者栈的出栈顺序也可以达到类似的效果)
import java.util.ArrayList;
public class Solution {
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
ArrayList<Integer> list=new ArrayList<>();
ListNode head=listNode;
if (listNode==null){
return list;
}else {
while(head!=null) {
list.add(0, head.val);
head = head.next;
}
return list;
}
}
}
方法三:递归
递归的思路和深度优先搜索类似,先到最后一个节点,然后依次添加元素并将集合返回。
import java.util.ArrayList;
public class Solution {
ArrayList list = new ArrayList();
public ArrayList printListFromTailToHead(ListNode listNode) {
if(listNode!=null){
printListFromTailToHead(listNode.next);
list.add(listNode.val);
}
return list;
}
}
不过递归的栈空间消耗过大,数组元素过多系统直接没给过。