题目:Reverse a singly linked list.
解题代码如下:
//迭代版
// reversed the whole linked list
// 时间复杂度 O(n),空间复杂度 O(1)
class Solution {
public:
ListNode* reverseList(ListNode* head) {
if (head == nullptr) return head;
ListNode* prev = head;
ListNode* cur = prev -> next;
while (cur != nullptr) {
prev -> next = cur -> next;
cur -> next = head;
head = cur;
cur = prev -> next;
}
return head;
}
};
// reversed the whole linked list
// 递归版
// 时间复杂度 O(n),空间复杂度 O(1)
class Solution {
public:
ListNode* reverseList(ListNode* head) {
if (head == nullptr) return head;
if (head -> next == nullptr) return head;
// head2 表示的是将要颠倒的子序列的头节点
ListNode* const head2 = head -> next;
auto h = reverseList(head2);
// 子序列颠倒完之后 head2 为颠倒后子序列的尾节点
// h 为颠倒后子序列的头节点
head2 -> next = head;
head -> next = nullptr;
head = h;
return head;
}
};