206. Reverse Linked List

Posted optor

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了206. Reverse Linked List相关的知识,希望对你有一定的参考价值。

原题链接:https://leetcode.com/problems/reverse-linked-list/description/
题目本身不难,难的是怎么写出高效优雅的代码来:

import java.util.Stack;

/**
 * Created by clearbug on 2018/2/26.
 */
public class Solution {

    public static void main(String[] args) {
        Solution s = new Solution();
        ListNode first = new ListNode(1);
        ListNode second = new ListNode(2);
        ListNode third = new ListNode(3);

        first.next = second;
        second.next = third;

        ListNode tail = s.reverseList(first);
        System.out.println(tail);
    }

    /**
     * 官方方法二:递归实现,比我的要简介很多
     *
     * Submission Detail: beats 25.36%
     * Runtime: 1 ms
     *
     * @param head
     * @return
     */
    public ListNode reverseList(ListNode head) {
        if (head == null || head.next == null) {
            return head;
        }

        ListNode tail = reverseList(head.next);
        head.next.next = head;
        head.next = null;
        return tail;
    }

    /**
     * 官方方法一:迭代实现,原来只需要两个指针即可,根本不需要一个栈
     *
     * Submission Detail: beats 100%
     * Runtime: 0 ms
     *
     * @param head
     * @return
     */
    public ListNode reverseList3(ListNode head) {
        if (head == null || head.next == null) {
            return head;
        }

        ListNode prev = null, curr = head;
        while (curr != null) {
            ListNode nextNode = curr.next;
            curr.next = prev;
            prev = curr;
            curr = nextNode;
        }

        return prev;
    }

    // 从提交结果来看,我的两种方法效率都很差,那么就去看看官方答案吧!

    /**
     * 我的方法二:迭代实现
     *
     * Submission Detail: beats 2.93%
     * Runtime: 3 ms
     *
     * @param head
     * @return
     */
    public ListNode reverseList2(ListNode head) {
        if (head == null || head.next == null) {
            return head;
        }

        Stack<ListNode> stack = new Stack<>();
        while (head != null) {
            stack.push(head);
            head = head.next;
        }

        ListNode tail = stack.pop();
        ListNode temp = tail;
        while (!stack.empty()) {
            ListNode node = stack.pop();
            node.next = null;
            temp.next = node;
            temp = temp.next;
        }
        return tail;
    }

    /**
     * 我的方法一:递归实现
     *
     * Submission Detail: beats 1.19%
     * Runtime: 27 ms
     *
     * @param head
     * @return
     */
    public ListNode reverseList1(ListNode head) {
        if (head == null || head.next == null) {
            return head;
        }

        ListNode tail = reverseList(head.next);
        ListNode temp = tail;
        while (temp.next != null) {
            temp = temp.next;
        }
        temp.next = head;
        head.next = null;
        return tail;
    }
}

以上是关于206. Reverse Linked List的主要内容,如果未能解决你的问题,请参考以下文章

206. Reverse Linked List

206. Reverse Linked List

206. Reverse Linked List

206. Reverse Linked List

No 206, Reverse Linked List

206. Reverse Linked List