标签:链表
题目描述
输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。
解题思路
- 1、一种方法是利用栈来实现,注意Stack的用法;
- 2、另外一种方法是利用三个指针把链表反转,关键是要用一个temp 指针保存断开的节点。另外第一个节点的next最后要断开。
需要记的模板
- 链表反转
ListNode head = Node;
ListNode cur = Node.next;
while(cur != null) {
ListNode temp = cur.next;
cur.next = head;
head = cur;
cur = temp;
}
Node.next = null;
- 出栈入栈
Stack<Integer> s = new Stack<>();
while(Node != null) {
s.push(Node.val);
Node = Node.next;
}
while(!s.isEmpty()) {
res.add(s.pop());
}
参考代码
import java.util.ArrayList;
import java.util.Stack;
class ListNode{
int val;
ListNode next;
ListNode(int val){
this.val = val;
}
}
public class BackToForward {
//方法一:利用栈先进后出的思想
public ArrayList<Integer> PrintListFromTailToHead(ListNode Node){
ArrayList<Integer> res = new ArrayList<>();
if(Node == null) {
return res;
}
Stack<Integer> s = new Stack<>();
while(Node != null) {
s.push(Node.val);
Node = Node.next;
}
while(!s.isEmpty()) {
res.add(s.pop());
}
return res;
}
//方法二:三个指针反转链表,一个额外空间temp记录第三个节点,
//每次只断开一个结点换方向
public ArrayList<Integer> PrintListFromTailToHead2(ListNode Node){
ArrayList<Integer> list = new ArrayList<>();
if(Node == null) {
return list;
}
ListNode head = Node;
ListNode cur = Node.next;
while(cur != null) {
ListNode temp = cur.next;
cur.next = head;
head = cur;
cur = temp;
}
//第一个节点和第二个节点间还有个正向的线连着,要去掉,不然成环
//现在的head是最后一个结点
Node.next = null;
while(head != null) {
list.add(head.val);
head = head.next;
}
return list;
}
public static void main(String[] args) {
BackToForward b = new BackToForward();
ListNode n1 = new ListNode(1);
ListNode n2 = new ListNode(2);
ListNode n3 = new ListNode(3);
n1.next = n2;
n2.next = n3;
System.out.println(b.PrintListFromTailToHead(n1));
System.out.println(b.PrintListFromTailToHead2(n1));
}
}
输出结果:
[3, 2, 1]
[3, 2, 1]