【LeetCode - Java练习】剑指 Offer 24. 反转链表(简单)

文章目录

  • 1.题目描述
  • 2.解题思路
  • 3.代码实现

1.题目描述

【LeetCode - Java练习】剑指 Offer 24. 反转链表(简单)_第1张图片

2.解题思路

方法一:迭代
假设链表为 1→2→3→∅,我们想要把它改成 ∅←1←2←3。
在遍历链表时,将当前节点的 next 指针改为指向前一个节点。由于节点没有引用其前一个节点,因此必须事先存储其前一个节点。在更改引用之前,还需要存储后一个节点。最后返回新的头引用。

复杂度分析
时间复杂度:O(n),其中 n 是链表的长度。需要遍历链表一次。
空间复杂度:O(1)。

方法二:递归
递归版本稍微复杂一些,其关键在于反向工作。假设链表的其余部分已经被反转,现在应该如何反转它前面的部分?
假设链表为:
n1 →…→nk−1 →nk →nk+1 →…→nm →∅
若从节点 nk+1到 nm 已经被反转,而我们正处于nk 。
n1 →…→nk−1 →nk →nk+1 ←…←nm
我们希望 nk+1的下一个节点指向 nk。
所以,nk.next.next=nk 。
需要注意的是n1的下一个节点必须指向∅。如果忽略了这一点,链表中可能会产生环。

复杂度分析
时间复杂度:O(n),其中 n 是链表的长度。需要对链表的每个节点进行反转操作。
空间复杂度:O(n),其中 n 是链表的长度。空间复杂度主要取决于递归调用的栈空间,最多为 n 层。

3.代码实现

方法一:

class Solution {
    public ListNode reverseList(ListNode head) {
        ListNode prev = null;
        ListNode curr = head;
        while (curr != null) {
            ListNode next = curr.next;
            curr.next = prev;
            prev = curr;
            curr = next;
        }
        return prev;
    }
}

方法二:

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

你可能感兴趣的:(LeetCode-Java,链表,leetcode,java)