题目描述
定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。
示例:
1 2
| 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL
|
限制:
0 <= 节点个数 <= 5000
题目链接
Leetcode
题目解答
解法一
迭代法,把当前节点记为curr
,prev
表示前一个节点,next
表示下一个节点,我们可以在遍历链表的同时把当前节点curr
的下一个节点指向前一个节点prev
,从而完成链表的反转。
时间复杂度:$O(n)$ 空间复杂度:$O(1)$
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
|
class Solution { public ListNode reverseList(ListNode head) { ListNode prev = null, curr = head; while (curr != null) { ListNode next = curr.next; curr.next = prev; prev = curr; curr = next; } return prev; } }
|
执行用时:0 ms, 在所有 Java 提交中击败了100.00%的用户
内存消耗:38.2 MB, 在所有 Java 提交中击败了52.24%的用户
解法二
链表反转刚好符合先进后出的情况,我们可以借助栈,通过递归的方式完成链表的反转。
时间复杂度:$O(n)$ 空间复杂度:$O(n)$
1 2 3 4 5 6 7 8 9 10 11
| 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; } }
|
执行用时:0 ms, 在所有 Java 提交中击败了100.00%的用户
内存消耗:38.1 MB, 在所有 Java 提交中击败了70.06%的用户
-------------本文结束 感谢您的阅读-------------
文章对您有帮助,可以打赏一杯咖啡,鼓励我继续创作!