题目要求
输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。
解题思路
1.反转单向链表(会改变链表的结构)
第一步:保存下一个元素next(要移到前面去)
第二步:建立关系:前面元素指向后边元素
第三步:后边的元素是原来的head
第四步:前边的元素是原来的next
2.用一个栈结构实现(后进先出)
3.递归(后一个先输出,再输出当前,但是当数据很长时,会造成函数调用栈溢出)
代码示例
第一种思路:
public static Node reverseList(Node head) {
Node pre=null;
Node next=null;
while(head!=null) {
//1.找到当前节点的下一个结点(next表示的是head的下一个结点)
next=head.next;
//2.建立联系,当前节点指向下一个结点,叫做pre(head指向pre)
head.next=pre;
//3.pre位置上存放的是原来的当前节点(pre位置上存放的是原来的head)
pre=head;
//4head位置上存放的是原来的当前节点的下一个结点(head位置上存放的是下一个节点)
head=next;
}
return pre;
}
第二种思路:
public class Solution {
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
//1.准备一个栈结构
Stack<Integer> s=new Stack<>();
//2.链表节点的值全部入栈
while(listNode!=null) {
s.push(listNode.val);
listNode=listNode.next;
}
//3.入栈完了之后出栈,存放到一个数组里面
//定义一个集合(存放链表节点)
ArrayList<Integer> array=new ArrayList<>();
while(!s.isEmpty()) {
array.add(s.pop());
}
return array;
}
}