LeetCode 206. Reverse Linked List

236 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第5天,点击查看活动详情

LeetCode 206. Reverse Linked List

给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。

示例 1:

输入: head = [1,2,3,4,5]
输出: [5,4,3,2,1]

示例 2:

输入: head = [1,2]
输出: [2,1]

示例 3:

输入: head = []
输出: []

 

提示:

  • 链表中节点的数目范围是 [0, 5000]
  • -5000 <= Node.val <= 5000

进阶: 链表可以选用迭代或递归方式完成反转。你能否用两种方法解决这道题?

算法1

递归
reverseList(head) 的作用是把所有由head指向的所有节点进行反转,可以把后面n - 1个结点看成一个整体,先进行反转得到tail链表,再把第一个结点拼在tail链表的尾部,且第一个结点最后指向null 假设链表为 1→2→3→∅ ,我们想要把它改成 ∅←1←2←3。

在遍历链表时,将当前节点的 next 指针改为指向前一个节点。由于节点没有引用其前一个节点,因此必须事先存储其前一个节点。在更改引用之前,还需要存储后一个节点。最后返回新的头引用。

时间复杂度 O(n) 空间复杂度 O(n)

ac代码

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    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;  
    }
}

算法2

迭代
1、若枚举到b位置,需要将b.next指向a
(1)、b.next = a
(2)、a和b指针同时往后移动1位
2、最后b走向null时,a在最后一个位置,直接返回a即可
时间复杂度 O(n)O(n)
空间复杂度 O(1)O(1)

ac代码

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode reverseList(ListNode head) {
        if(head == null) return head;
        ListNode a = head,b = a.next;
        while(b != null)
        {
            ListNode c = b.next;
            b.next = a;
            a = b;
            b = c;
        }
        head.next = null;
        return a;
    }
}