迭代(双指针)解法
复杂度分析:
- 时间复杂度 O(N): 遍历链表使用线性大小时间。
- 空间复杂度 O(1) : 变量
pre
和cur
使用常数大小额外空间。
class Solution {
public ListNode reverseList(ListNode head) {
ListNode cur = head, pre = null;
while(cur != null){
ListNode tmp = cur.next; //暂存后继节点
cur.next = pre; //修改引用指向
pre = cur; //暂存当前节点
cur = tmp; //访问下一节点
}
return pre;
}
}
递归解法
复杂度分析:
时间复杂度 O(N) : 遍历链表使用线性大小时间。
空间复杂度 O(N): 遍历链表的递归深度达到 N ,系统使用 O(N)大小额外空间。
class Solution {
public ListNode reverseList(ListNode head) {
return recur(head, null);
}
private ListNode recur(ListNode cur, ListNode pre){
if(cur == null) return pre; //终止条件
ListNode res = recur(cur.next, cur); //递归后继节点
cur.next = pre; //修改节点引用指向
return res; //返回反转链表的头节点
}
}