迭代思想:
记录当前节点 curr
和上一个节点 prev
。
遍历链表,不断将 curr->next
指向 prev
。
把当前节点放到上一节点的前面。
递归思想:
递归函数返回的已经排序的链表有特点:
out -> node1-> node2 -> ... -> nodex -> nullptr
head -> nodex -> nullptr
因此,不需要遍历返回的链表找到最后一个节点,head
的指向就是最后一个节点。
注意:head -> next = nullptr
不能省略。否则会报错 “head use after free”
链表的结尾一定要指向 nullptr
附上代码:
迭代
class Solution {
public:
ListNode* reverseList(ListNode* head) {
ListNode* curr = head;
ListNode* prev = nullptr;
while(curr){
ListNode* temp = curr->next;
curr->next = prev;
prev = curr;
curr = temp;
}
return prev;
}
};
递归
class Solution {
public:
ListNode* reverseList(ListNode* head) {
if(!head||!head->next) return head;
ListNode* out = reverseList(head->next);
head->next->next = head;
head->next = nullptr;
return out;
}
};