反转一个单链表。
示例:
输入:1->2->3->4->5->NULL
输出:5->4->3->2->1->NULL
思路:运用迭代的方法(迭代:每次都过程的重复称为一次“迭代”,每一次迭代得到 的结果会作为下一次迭代的初始值 )改变链表结点的指向。
以1、2、3、4、5举例
先使n2指向n1,n3用来表示下一结点,以此类推到到达最后一组。
代码如下:
Linklist reverse(Linklist &L)
{
if(L==NULL||L->next==NULL)
return L;
Linklist n1=NULL,n2=L,n3=L->next;
while(n2)
{
n2->next=n1;//反转
//迭代
n1=n2;
n2=n3;
if(n3!=NULL) //n3==NULL时,无需迭代
n3=n3->next;
}
L=n1;//n1为首元结点
return L;
}
全部代码:
#include<stdio.h>
#include<stdlib.h>
typedef struct Node
{
int data;
struct Node*next;
}Lnode,*Linklist;
void Initlist(Linklist&L)
{
L=new Lnode;
L->next=NULL;
}
void Creatlist(Linklist&L,int n)
{
Linklist r=L;
int i=0;
for(i=0;i<n;i++)
{
Lnode *p=new Lnode;
scanf("%d",&p->data);
p->next=NULL;
r->next=p;
r=p;
}
printf(" 输入成功!!\n");
}
Linklist reverse(Linklist &L)
{
if(L==NULL||L->next==NULL)
return L;
Linklist n1=NULL,n2=L,n3=L->next;
while(n2)
{
n2->next=n1;//反转
//迭代
n1=n2;
n2=n3;
if(n3!=NULL) //n3==NULL时,无需迭代
n3=n3->next;
}
L=n1;//n1为首元结点
return L;
}
int Printlist(Linklist&L)
{
Linklist p=new Lnode;
p=L;
printf("输出结果为:\n");
while(p->next)//不知道为什么写p时 p=NULL仍能执行
{
printf("%2d",p->data);
p=p->next;
}
}
int main()
{
Linklist L;
Initlist(L);
int n;
printf("请输入要几组元素 ");
scanf("%d",&n);
Creatlist(L,n);
reverse(L);
Printlist(L);
}