问题描述:输入一个链表,反转链表后,输出链表的所有元素。
import java.util.ArrayList;
import java.util.Stack;
class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}
public class Solution {
//方法1:使用ArrayList作中介
public static ListNode ReverseList(ListNode head) {
ArrayList<Integer> list = new ArrayList<Integer>();
ListNode temp = head;
while(head != null){
list.add(head.val);
head = head.next;
}
ListNode t = temp; //很关键一句
for (int i = list.size()-1; i >= 0; i--){
temp.val = list.get(i);
temp = temp.next;
}
return t;
}
//方法2:使用栈结构作中介
public static ListNode ReverseList1(ListNode head) {
Stack<Integer> stack = new Stack<Integer>();
ListNode temp = head;
while(temp != null){
stack.push(temp.val);
temp = temp.next;
}
ListNode t = head; //同样很关键一句
while (!stack.isEmpty()){
head.val = stack.pop();
head = head.next;
}
return t;
}
}
总结:两种方法都是使用另外的结构来作为中介,使用ArrayList存储后再从尾到头进行遍历,进而存储回链表中,或者使用Stack先进后出的原理,入栈再出栈存储回原来的链表中。其中应该注意到的两点即是遍历链表时,应保留头结点的引用。第二点则是代码中关键的那一句,因为漏了这一句,蛋疼了很久,原因在于之前直接将其链表返回,但是由于之前存储时,链表引用已经到尾了,所以直接提交导致测试用例测试时候直接从尾开始遍历,所以得到空的结果集,一直AC不了。所以使用t的作用也是保存头结点引用。