我们抽象一个节点:当前值,后续值,这样就可以当前值、后续值创建一个指针序列,通过递归函数实现经典反转。该反转的经典之处在于:从头开始,如果不是最后一个node,直接递归,后续执行挂起,直到找到最后一个node,直接与前一个node交换,且把指针头设为最后一个node。前面挂起的函数再依次执行。
#include <iostream>
using namespace std;
struct node
{
int val;
node *next;
};
node *start; //指针头
void insert(int x)
{
node *t = start;
if (start == NULL)
{
node *n = new node();
n->val = x;
n->next = NULL;
start = n;
}
else
{
while (t->next!=NULL)
{
t = t->next;
}
node *n = new node;
n->val = x;
n->next = NULL;
t->next = n;
}
}
//反转函数
void reverse(node *p, node *q)
{
//如果是最后一个node,则直接反转,并设为指针头
if (q->next == NULL)
{
q->next = p;
p->next = NULL;
start = q;
}
else
{
//如果不是最后一个node,直接递归,函数执行暂停,直到找到最后一个node
reverse(q, q->next);
q->next = p;
p->next = NULL;
}
}
void show()
{
node *t = start;
cout << std::endl;
while (t->next != NULL)
{
cout << t->val << "\t";
t = t->next;
}
cout << t->val << "\t";
}