题目
输入一个链表,按链表从尾到头的顺序返回一个ArrayList。
1.思路
解法1:遍历单链表,头插法逆置链表。
解法2:借助栈。
解法3:递归。
2.代码(Java实现)
结点类定义
/**
* public class ListNode {
* int val;
* ListNode next = null;
*
* ListNode(int val) {
* this.val = val;
* }
* }
*
*/
(1)解法1:头插法
import java.util.ArrayList;
public class Solution {
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
ListNode p = listNode;
ListNode q = p;
ListNode r = new ListNode(0);
r.next = null;
while(p!=null){ //头插法逆置链表
q = p.next;
p.next = r.next;
r.next = p;
p = q;
}
ArrayList<Integer> array = new ArrayList<Integer>();
ListNode ss = r.next;
//遍历新链表,将结点的值赋给数组
while(ss!=null) {
array.add(ss.val);
ss = ss.next;
}
// 检验是否逆置成功
// System.out.print(array);
return array;
}
}
(2)解法2:借助栈
import java.util.ArrayList;
import java.util.Stack;
public class Solution {
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
Stack<ListNode> stack = new Stack<ListNode>();
ListNode p = listNode;
while (p != null) {
stack.push(p);
p = p.next;
}
ArrayList<Integer> array = new ArrayList<Integer>();
while (!stack.isEmpty()) { // 头插法逆置链表
array.add(stack.pop().val);
}
System.out.print(array);
return array;
}
}
(3)解法3:递归
//以下代码在自己的IDE上调试的时候需要修改,但是在线代码测试是可以通过的,因为样例是一个一个来的
import java.util.ArrayList;
public class Solution {
ArrayList<Integer> array = new ArrayList<Integer>();
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
if (listNode != null) {
printListFromTailToHead(listNode.next); //递归调用
array.add(listNode.val);
}
return array;
}
}
本文作者:
whtli
本文链接: https://hexo.whtli.cn/archives/20e208b.html
版权声明: 遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
本文链接: https://hexo.whtli.cn/archives/20e208b.html
版权声明: 遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。