JZ24 反转链表

85 阅读1分钟

leetcode.cn/problems/fa…

定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。

 

示例:

输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL  

限制:

0 <= 节点个数 <= 5000

解题思路

如下图所示,题目要求将链表反转。本文介绍迭代(双指针)、递归两种实现方法。

image.png

方法一:迭代(双指针)

考虑遍历链表,并在访问各节点时修改 next 引用指向,算法流程见注释。

复杂度分析:

时间复杂度 O(N) : 遍历链表使用线性大小时间。 空间复杂度 O(1) : 变量 pre 和 cur 使用常数大小额外空间。

代码

class Solution {
    public ListNode reverseList(ListNode head) {
        ListNode pre = null;
        ListNode cur = head;
        while (cur != null) {
            ListNode temp = cur.next;
            cur.next = pre;
            pre = cur;
            cur = temp;
        }
        return pre;
    }
}

方法二:递归

image.png

代码

class Solution2 {
    public ListNode reverseList(ListNode head) {
        return recur(head, null);
    }

    public ListNode recur(ListNode cur, ListNode pre) {
        if (cur == null) {
            return pre;
        }
        ListNode result = recur(cur.next, cur);
        cur.next = pre;
        return result;
    }
}