#include<iostream>
struct ListNode
{
int value;
ListNode *next;
ListNode(int value, ListNode* node) : value(value), next(node)
{
}
};
void traverseList(ListNode *head)
{
while (head != NULL)
{
std::cout << head->value << " ";
head = head->next;
}
std::cout << std::endl;
}
ListNode * reverseList(ListNode *head)
{
//设置递归出口,当链表没有一个元素或者只有一个元素的时候,这两种情况下反转之后是它本身,
if (head == NULL || head->next == NULL)
{
//这里是链表的的最后一个节点的返回,即当reverseList的参数head->next表示的是最后一个节点的时候的返回出口
return head;
}
//递归的递的过程,递到最深的时候,是找到了最后一个节点,此时head指向了最后一个节点,这个节点可以认为是反转后的链表的头指针
ListNode * reverseHead = reverseList(head->next);
//当第一次执行到这里时候,表示head->next是链表的最后一个节点的元素作为reverseList的参数的情况得到了返回,这里第一此被执行时,此时的head->next表示的是倒数第二个节点做作为reverseList的参数
//递归思想可以理解成每一个节点都作为了reverseList的参数,最后一个节点作为reverseList的参数时通过上面的return返回,当第一次执行这里的时候,该时倒数第二个节点作为reverseList的参数求返回值的情况,所以此时head->next表示的是倒数第二个参数
//递归的归的过程,从最后一个节点开始,依次使得他的后一个节点的指向指向它,并且使得他本身的next指针指向了NULL
head->next->next = head;
head->next = NULL;
//向上层传递反转链表的头指针
//这里是链表的的除了最后一个节点的其他节点的返回,即当reverseList的参数head->next表示的是 除了最后一个节点的时候 的返回出口
return reverseHead;
}
int main()
{
ListNode * node1 = new ListNode(1, nullptr);
ListNode * node2 = new ListNode(2, nullptr);
ListNode * node3 = new ListNode(3, nullptr);
ListNode * node4 = new ListNode(4, nullptr);
node1->next = node2;
node2->next = node3;
node3->next = node4;
//原始链表
ListNode *oldHead = node1;
traverseList(node1);
//反转链表
ListNode *newHead = reverseList(node1);
traverseList(newHead);
}
反转链表之递归解答
于 2022-03-11 23:12:30 首次发布