定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。
示例:
输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL
限制:
0 <= 节点个数 <= 5000
解题思路
如下图所示,题目要求将链表反转。本文介绍迭代(双指针)、递归两种实现方法。
方法一:迭代(双指针)
考虑遍历链表,并在访问各节点时修改 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;
}
}
方法二:递归
代码
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;
}
}