题目描述
输入一个链表,按链表从尾到头的顺序返回一个ArrayList。
解题思路
1.对链表进行翻转,读取数据进ArrayList.
2.直接读取数据,从头部存入ArrayList.
Java 实现
直接读取,数组头部插入
import java.util.ArrayList;
public class Solution {
public ArrayList<Intrger> printListFromTailToHead(ListNode listNode) {
ArrayList list = new ArrayList();
while(listNode != null){
list.add(0, listNode.val);
listNode = listNode.next;
}
return list;
}
}
对链表指针进行翻转后,进行输出
import java.util.ArrayList;
public class Solution {
// 从链表中读取数据进数组中
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
ListNode reverNode = reverNode(listNode); // 链表翻转
ArrayList list = new ArrayList(); // 建立空数组
while(reverNode != null){ // 循环读取数据
list.add(reverNode.val);
reverNode =reverNode.next;
}
return list;
}
// 实现单向链表的翻转
public static ListNode reverNode(ListNode Node){
// 如果链表为空或只有一个节点,直接返回原链表
if (Node == null || Node.next == null){
return Node;
}
ListNode preNode = null; // 链表前项节点指针
ListNode curNode = Node; // 链表当前节点指针
ListNode nextNode = null; // 链表后项节点指针
while(curNode != null){ // 循环变更链表的指向
nextNode = curNode.next; // 后项指针,指向后一个节点
curNode.next = preNode; // 当前节点指针翻转指向前节点
preNode = curNode; // 前项指针,移动到当前节点
curNode = nextNode; // 当前指针,移动到下一个节点
}
return preNode;
}
}
Python 实现
列表的反向: 1. list.reverse(); 2.反向切片[::-1] 3.手动序列赋值。
class Solution:
def printListFromTailToHead(self, listNode):
l = []
while listNode:
l.append(listNode.val)
listNode = listNode.next
return l[::-1] # 反向打印
基于栈的递归(也可使用list的append,pop模拟栈改为迭代形式)
class Solution:
l = []
def printListFromTailToHead(self, listNode):
if listNode:
printListFromTailToHead(listNode.next) # 递归调用
l.append(listNode.val) # 栈的作用,后节点数据先进入列表
return l