开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第5天,点击查看活动详情
LeetCode 206. Reverse Linked List
给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。
示例 1:
输入: head = [1,2,3,4,5]
输出: [5,4,3,2,1]
示例 2:
输入: head = [1,2]
输出: [2,1]
示例 3:
输入: head = []
输出: []
提示:
- 链表中节点的数目范围是
[0, 5000] -5000 <= Node.val <= 5000
进阶: 链表可以选用迭代或递归方式完成反转。你能否用两种方法解决这道题?
算法1
递归
reverseList(head) 的作用是把所有由head指向的所有节点进行反转,可以把后面n - 1个结点看成一个整体,先进行反转得到tail链表,再把第一个结点拼在tail链表的尾部,且第一个结点最后指向null
假设链表为 1→2→3→∅ ,我们想要把它改成 ∅←1←2←3。
在遍历链表时,将当前节点的 next 指针改为指向前一个节点。由于节点没有引用其前一个节点,因此必须事先存储其前一个节点。在更改引用之前,还需要存储后一个节点。最后返回新的头引用。
时间复杂度 O(n) 空间复杂度 O(n)
ac代码
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode reverseList(ListNode head) {
if(head == null || head.next == null) return head;
ListNode tail = reverseList(head.next);
head.next.next = head;
head.next = null;
return tail;
}
}
算法2
迭代
1、若枚举到b位置,需要将b.next指向a
(1)、b.next = a
(2)、a和b指针同时往后移动1位
2、最后b走向null时,a在最后一个位置,直接返回a即可
时间复杂度 O(n)O(n)
空间复杂度 O(1)O(1)
ac代码
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode reverseList(ListNode head) {
if(head == null) return head;
ListNode a = head,b = a.next;
while(b != null)
{
ListNode c = b.next;
b.next = a;
a = b;
b = c;
}
head.next = null;
return a;
}
}