反转链表

来源:互联网 发布:中转国际机票 知乎 编辑:程序博客网 时间:2024/06/06 19:16

问题描述:输入一个链表,反转链表后,输出链表的所有元素。

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的作用也是保存头结点引用。

原创粉丝点击