题目:用单链表作存储结构,编写一个实现链表中元素逆置的递归算法。
1.先从非递归算法开始
#include <iostream>
using namespace std;
struct node
{
int data;
node* link;
};
//非递归算法
int main()
{
node* head=NULL,*tail=NULL, * p, * q;
//建链(不带头结点) 以0 为结束
while (1)
{
p = new node;
cin >> p->data;
if (p->data == 0)
break;
if (head == NULL)
{
head = p;
tail = p;
}
else
{
tail->link = p;
tail = p;
}
}
tail->link = NULL;
//输出逆置前的链表
p = head;
while (p != NULL)
{
cout << p->data << " ";
p = p->link;
}
cout << endl;
//逆置链表
p = head;
head = head->link;
p->link = NULL;
while (head->link != NULL)
{
q = head->link;
head->link = p;
p = head;
head = q;
}
head->link = p;
//输出逆置后的链表
p = head;
while (p!= NULL)
{
cout << p->data<<" ";
p = p->link;
}
return 0;
}
-----------------------------------------------------------------------
递归算法
递归关键在回溯
回溯,之后,一直做的重复操作
写一个函数,得到需要的最终结点。
很明显,最终结点在链尾。
所以每次回溯一层,newhead 不能动。
以下是函数的递归回溯过程
代码实现:
node* inverse(node * &head)
{
node* p;
node* q;
if (head->link == NULL||head==NULL)
return head;
node* newnode = inverse(head->link); //不断往下指,直到NULL,回弹。
head->link->link = head;
head->link = NULL;
return newnode;
}