力扣 - 206. 反转链表
题目
思路1
- 迭代方法,在遍历过程中一边遍历,一遍将next指针改变
- 我们需要一个pre指针记录上一个当前结点的上一个,方便修改
- 时间复杂度O(n),空间复杂度O(1)
代码实现
class Solution {
public ListNode reverseList(ListNode head) {
//记录上一个结点
ListNode pre = null;
ListNode cur = head;
//不为null说明还没到链表尾部
while (cur != null) {
//先记录下一个结点
ListNode n = cur.next;
//改变当前结点的next指针
cur.next = pre;
//cur和pre都后移一位
pre = cur;
cur = n;
}
//最后不要忘了返回链表的头结点
return pre;
}
}
思路2
- 利用递归解决
- 递归的终止条件就是到达链表尾部,然后将他作为头节点返回
- 利用当前结点,设置下一个节点的next为当前节点
- 同时还要将当前的next指向null,因为最后一个节点要指向null
- 时间复杂度O(n),空间复杂度O(n)
代码实现
class Solution {
public ListNode reverseList(ListNode head) {
//如果是最后一个结点就结束递归,将他作为头结点返回
if (head == null || head.next == null) {
return head;
}
//设置后一个结点的next指向
ListNode p = reverseList(head.next);
head.next.next = head;
//将当前结点next指向null,这样就不用单独为最后一个结点指定null了
head.next = null;
return p;
}
}
我走得很慢,但我从不后退!

浙公网安备 33010602011771号