欢迎访问LeetCode题解合集
题目描述
反转一个单链表。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
进阶:
你可以迭代或递归地反转链表。你能否用两种方法解决这道题?
题解:
法一:
迭代。
使用一个前驱节点,保存每个节点的前一个节点,然后依次将每个节点的 next
指向前驱节点即可。
时间复杂度:$O(n)$
额外空间复杂度:$O(1)$
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* reverseList(ListNode* head) {
if ( !head || !head->next )
return head;
ListNode *pre = nullptr, *next = nullptr;
while ( head ) {
next = head->next;
head->next = pre;
pre = head;
head = next;
}
return pre;
}
};
/*
时间:0ms,击败:100.00%
内存:7.9MB,击败:97.60%
*/
法二:
递归。
将 head->next
部分反转,然后将 head
接在后面。需要返回新链表的头节点,也就是原链表的尾节点。
时间复杂度:$O(n)$
额外空间复杂度:$O(n)$
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* reverseList(ListNode* head) {
if ( !head || !head->next )
return head;
ListNode *new_head = reverseList(head->next);
head->next->next = head;
head->next = nullptr;
return new_head;
}
};
/*
时间:0ms,击败:100.00%
内存:8.3MB,击败:38.87%
*/