题目地址:
https://www.acwing.com/problem/content/33/
定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点。
可以用非递归或者递归来写。非递归版本代码如下:
struct ListNode {
int val;
ListNode *next;
ListNode(int x): val(x) {
}
};
class Solution {
public:
ListNode* reverseList(ListNode* head) {
ListNode *prev = nullptr, *tmp = nullptr;
while (head) {
tmp = head->next;
head->next = prev;
prev = head;
head = tmp;
}
return prev;
}
};
时间复杂度 O ( n ) O(n) O(n),空间 O ( 1 ) O(1) O(1), n n n为链表长度。
递归版本代码如下:
struct ListNode {
int val;
ListNode *next;
ListNode(int x): val(x) {
}
};
class Solution {
public:
ListNode* reverseList(ListNode* head) {
if (!head || !head->next) return head;
ListNode *res = reverseList(head->next);
head->next->next = head;
// 注意要把head->next置空,此时head是返回的链表的表尾
head->next = nullptr;
return res;
}
};
时空复杂度 O ( n ) O(n) O(n)。