从尾到头打印链表
问题描述
输入一个链表的头结点,按链表从尾到头的顺序返回一个ArrayList。
解法1:反转链表
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
ArrayList<Integer> arrayList = new ArrayList<>();
// 判空
if (listNode == null) {
return arrayList;
}
ListNode head = reverse(listNode);
// 将结点数据写入arrayList
do {
arrayList.add(head.val);
} while ((head = head.next) != null);
return arrayList;
}
/**
* 链表转置
* @param head
* @return
*/
public ListNode reverse(ListNode head) {
// 返回的头 原来链表的尾
ListNode rNode = null;
ListNode node = head;
ListNode preNode = null;
while (node != null) {
// 记录当前节点的下一个节点
ListNode nextNode = node.next;
// 下一个结点为null 则当前结点node为尾结点
if (nextNode == null) {
rNode = node;
}
// 交换指针
node.next = preNode;
preNode = node;
node = nextNode;
}
return rNode;
}
解法2:
使用栈结构 推荐**
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
ArrayList<Integer> arrayList = new ArrayList<>();
// 判空
if (listNode == null) {
return arrayList;
}
Stack<Integer> stack = new Stack<>();
do {
// 链表数据进栈
stack.push(listNode.val);
} while ((listNode = listNode.next) != null);
while (!stack.empty()){
// 堆栈数据添加到list集合
arrayList.add(stack.pop());
}
return arrayList;
}
解法3:
递归
方法的重载:方法参数不同即可(类型或者参数个数 和返回参数和参数名无关)
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
ArrayList<Integer> arrayList = new ArrayList<>();
// 判空
if (listNode == null) {
return arrayList;
}
printListFromTailToHead(arrayList, listNode);
return arrayList;
}
public void printListFromTailToHead(ArrayList<Integer> arrayList, ListNode listNode) {
if (listNode != null) {
if (listNode.next != null) {
printListFromTailToHead(arrayList, listNode.next);
}
arrayList.add(listNode.val);
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?