反转链表
递归版本
递归问题分清已处理的子问题、正在处理的当前问题、将要处理的父问题:在子问题基础上叠加当前层处理形成新的已解决子问题,有关返回值的利用有二:①子调用返回值后在当前层的处理②当前层作为子调用可以给父调用返回什么
此处
①每层修改后续节点指针,使得 后->前
②父调用需要新头节点,每层子调用返回原尾节点
其他细节:
①当前层完成 后->前 之后,应清空 前->后 避免形成环,本操作同时使原头节点变为后续为空的尾节点
②递归边界是返回非空尾节点,以及对空样例的解决
ListNode *reverseList(ListNode *head) {
if (head == nullptr || head->next == nullptr)
return head;
ListNode *suc = reverseList(head->next);
head->next->next = head;
head->next = nullptr;
return suc;
}