难度:easy
两种方法:迭代法和递归法
一.迭代法
Java:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode reverseList(ListNode head) {
ListNode pre = null, cur = head, next = null;
while(cur != null) {
next = cur.next; //存储下一个节点
cur.next = pre; //指针反转
pre = cur; //更新前一个节点
cur = next; //更新下一个节点
}
return pre; //返回头结点
}
}
复杂度分析:
- 时间复杂度:O(n),其中 n 是链表的长度。需要遍历链表一次。
-
空间复杂度:O(1)。
递归法:
class Solution {
public ListNode reverseList(ListNode head) {
return reverse(null, head);
}
private static ListNode reverse(ListNode pre, ListNode cur) {
//递归停止条件
if(cur == null) {
return pre;
}
ListNode next = cur.next;
cur.next = pre;
pre = cur;
cur = next;
return reverse(pre, cur);
}
}
复杂度分析:
- 时间复杂度:O(n),其中 n 是链表的长度。需要对链表的每个节点进行反转操作。
- 空间复杂度:O(n),其中 n 是链表的长度。空间复杂度主要取决于递归调用的栈空间,最多为 n 层。
另外:
也可以用栈来模拟递归,和递归的思想是一样的;