[LeetCode] 206. Reverse Linked List

Given the head of a singly linked list, reverse the list, and return the reversed list.

Example 1:
Example 1
Input: head = [1,2,3,4,5]
Output: [5,4,3,2,1]

Example 2:
Example 2
Input: head = [1,2]
Output: [2,1]

Example 3:
Input: head = []
Output: []

Constraints:
The number of nodes in the list is the range [0, 5000].
-5000 <= Node.val <= 5000

Follow up: A linked list can be reversed either iteratively or recursively. Could you implement both?

反转链表。
这类reverse的题不会写,会写homebrew也枉然。

思路 - 迭代

首先是 iterative 的思路,创建一个空的指针 pre。当 head 不为空的时候,先存住 head.next,然后 head.next 指向 pre,最后 pre,head,next 三个指针整体往后移动一位。

也分享一个注释写的比较好的discussion一个动图帮助理解。

复杂度

时间O(n)
空间O(1)

代码

Java实现

class Solution {
    public ListNode reverseList(ListNode head) {
        // corner case
        if (head == null || head.next == null) {
            return head;
        }

        // normal case
        ListNode pre = null;
        while (head != null) {
            ListNode next = head.next;
            head.next = pre;
            pre = head;
            head = next;
        }
        return pre;
    }
}

JavaScript实现

/**
 * @param {ListNode} head
 * @return {ListNode}
 */
var reverseList = function(head) {
    // corner case
    if (head === null || head.next === null) {
        return head;
    }

    // normal case
    let pre = null;
    while (head !== null) {
        let next = head.next;
        head.next = pre;
        pre = head;
        head = next;
    }
    return pre;
};

思路 - 递归

这道题还有递归的做法。递归的思想是把大的问题拆解成足够小的问题,小的问题解决了,大的问题也就能解决。

复杂度

时间O(n)
空间O(n) - 递归栈空间

代码

Java实现

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode reverseList(ListNode head) {
        // 递归终止条件
        if (head == null || head.next == null) {
            return head;
        }

        // 存住next节点
        ListNode next = head.next;
        // 递归函数处理next以及之后的部分
        ListNode newHead = reverseList(next);
        // 处理当前节点和next之间的指针
        // 本来head的next指针是指向next的,现在要反过来
        next.next = head;
        head.next = null;
        return newHead;
    }
}

相关题目

206. Reverse Linked List
92. Reverse Linked List II
posted @ 2019-10-14 11:51  CNoodle  阅读(156)  评论(0编辑  收藏  举报