翻转链表常用写法
循环写法
class Solution {
public:
ListNode* reverseList(ListNode* head) {
ListNode *prev = nullptr, *next = nullptr, *now = head;
while(now) {
next = now->next;
now->next = prev;
prev = now;
now = next;
}
return prev;
}
};
因为最后now会移动到nullptr,所以需要返回prev
递归写法
class Solution {
public:
ListNode* reverseList(ListNode* head) {
if (!head || !head->next) {
return head;
}
ListNode* fa = reverseList(head->next);
head->next->next = head;
head->next = nullptr;
return fa;
}
};
注意边界条件不仅仅是!head->next
还要加上!head
来应对输入链表为空的情况,其他情况下只有一个特判条件都不会有问题;但是如果输入链表为空,就会试图访问nullptr的next,导致runtime error。