题目描述:
首先附上代码:
/**
* 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 == nullptr || head->next ==nullptr){
return head;
}
ListNode *newHead = reverseList(head->next);
head->next->next = head;
head->next =nullptr;
return newHead;
}
};
if(head == nullptr //用来判断链表本来就是空的,那么直接返回
以head = [1,2,3,4,5]为例,假设此时内存是下面这样:
地址(示意) | val 域 | next 域 |
... | .... | .... |
0x04 | 4 | 0x05 |
0x05 | 5 | NULL |
... | .... | .... |
1.、假设本层的递归中,head 为 0x04,if判断通过,执行 reverseList(head->next),
其中 head->next 的值是 0x05,进入下层递归;
2、这层递归 if 不通过,返回 head(0x05),执行步骤1、的下面代码;
3、返回的 0x05 被赋值给 newHead,注意此时的 head 的值是 0x04(对应步骤1、),然后执行递归的核心:
head->next->next = head;
head->next =nullptr;
head->next->next 这个看上去很别扭,让我们拆分开来看看:head->next 就是地址 0x05,
然后 0x05->next被赋值为 head 即 0x04,此时,也就完成了 5 和 4 的反转。
head->next =nullptr; 这行代码用于将 head 的 next 域置为 nullptr;
此时:
地址(示意) | val 域 | next 域 |
... | .... | .... |
0x04 | 4 | nullptr |
0x05 | 5 | 0x04 |
... | .... | .... |
然后逐层返回递归,完成整个链表的反转。