📜  我们可以在小于 O(n) 的时间内反转链表吗?(1)

📅  最后修改于: 2023-12-03 14:54:23.375000             🧑  作者: Mango

反转链表

问题描述

给定一个单向链表的头节点,如何在小于O(n)的时间复杂度内将链表反转?

解决方案
递归法

递归法实现起来非常简单,思路是先让节点的下一个节点指向自己,再让自己指向前一个节点,递归到链表尾部后,将链表的头节点指向尾节点即可。时间复杂度为O(n),空间复杂度为O(n)。

public ListNode reverseList(ListNode head) {
    if (head == null || head.next == null) {
        return head;
    }
    ListNode p = reverseList(head.next);
    head.next.next = head;
    head.next = null;
    return p;
}
迭代法

迭代法实现起来稍微复杂一些,其基本思路是维护三个指针,分别指向当前节点、前一个节点和后一个节点。时间复杂度为O(n),空间复杂度为O(1)。

public ListNode reverseList(ListNode head) {
    if (head == null) {
        return null;
    }
    ListNode pre = null;
    ListNode cur = head;
    while (cur != null) {
        ListNode next = cur.next;
        cur.next = pre;
        pre = cur;
        cur = next;
    }
    return pre;
}
总结

本文介绍了两种方法实现反转链表,递归法和迭代法。递归法代码简洁,但空间复杂度较高;迭代法代码略微复杂,但空间复杂度更低。在实际应用中应根据具体情况选择不同的方式。