1.声明两个指针*q,*p,p指向头结点的next,q指向p的next,让头结点的next为空,链表逆置相当于建立一个新的链表,只是需要将所需的结点在另一个链表中得到。
2.让链表的头结点的next为空,是让它继续当新链表的头结点。
3.新链表的链接和逆序建链表类似,都是让结点直接插入到头结点的后边。
4.所需结点的得到,使用p和q在原来的链表中依次得到,p永远指向将要链接的结点,q指向p结点的下一个结点。
5.当链接上一个结点的时候,让p指向q,q指向它的next,直到q为空结点。
//链表逆置
#include <iostream>
#include<stdlib.h>
using namespace std;
struct node
{
int x;
struct node *next;
};
//顺序建表
struct node *creatListShun(int lenth)
{
struct node *head,*t,*p;
int i;
head=(struct node *)malloc(sizeof(struct node));
head->next=NULL;
t=head;
for(i=0; i<lenth; i++)
{
p=(struct node *)malloc(sizeof(struct node));
p->x=i;
p->next=NULL;
t->next=p;
t=p;
}
return head;
}
struct node *nizhi(struct node *head)
{
struct node *p,*q;
p=head->next;
head->next=NULL;
q=p->next;
while (p!=NULL)
{
p->next=head->next;
head->next=p;
p=q;
if (q) q=q->next;
}
return head;
}
int main()
{
struct node *head,*t;
head=creatListShun(10);//顺序建链表
t=head->next;
cout<<"顺序建链表 :";
while(t!=NULL)
{
cout<<t->x<<" ";
t=t->next;
}
cout<<endl;
head=nizhi(head);//链表逆置
t=head->next;
cout<<"链表逆置 :";
while(t!=NULL)
{
cout<<t->x<<" ";
t=t->next;
}
cout<<endl;
return 0;
}