📅  最后修改于: 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;
}
本文介绍了两种方法实现反转链表,递归法和迭代法。递归法代码简洁,但空间复杂度较高;迭代法代码略微复杂,但空间复杂度更低。在实际应用中应根据具体情况选择不同的方式。