剑指offer-翻转链表

版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/PZHU_CG_CSDN/article/details/82182558

题目描述:

输入一个链表,反转链表后,输出新链表的表头。

时间限制:1秒
空间限制:32768K

方法一:先把所有节点全部取出来,再来重构链表。
import java.util.ArrayList;
import java.util.List;

public class Solution {
    public ListNode ReverseList(ListNode head) {
        List<ListNode> list = new ArrayList<>();
        while (head != null) {
            list.add(head);
            head = head.next;
        }
        ListNode temp = null,newHead = null;
        //防止越界。
        if (list.size() == 0) {
            return newHead;
        }
        temp = newHead = list.get(list.size()-1);
        for (int i = list.size()-2;i >= 0;i--) {
            temp.next = list.get(i);
            temp = temp.next;
            if(i == 0) {
                temp.next = null;
            }
        }
        return newHead;
    }
}
方法二:在第一次遍历链表后、获取节点数据时就进行重构操作。
public class Solution {
    public ListNode ReverseList(ListNode head) {
        ListNode pre = null;
        ListNode next = null;
        while (head != null) {
            next = head.next;
            head.next = pre;
            pre = head;
            head = next;
        }
        return pre;
    }
}

只要能知道当前节点的前一个节点就能够将链表翻转,所以用 pre 来保存前一个节点,然当前节点的 next 指向上一个节点(翻转操作),然后再更新节点信息,这样操作只多开辟了两个节点,不会浪费太多的空间。

猜你喜欢

转载自blog.csdn.net/PZHU_CG_CSDN/article/details/82182558