逆置链表
题目
创建一个长度为11的线性单链表:0、1、2、3、4、5、6、7、8、9、10。并将其逆置,要求逆置过程不能创立新结点。
#include<iostream>
#include<malloc.h>
#define OVERFLOW -1
using namespace std;
typedef int ElemType;
//建立链表结构体
typedef struct LNode{
ElemType elem;
struct LNode *next;
}LNode,*LinkList;
//定义链表
int InitList(LinkList &L){
L=(LinkList)malloc(sizeof(LNode));
if(!L){
exit(OVERFLOW);
}
L->next=NULL;
return 1;
}
//尾插法创建链表
int CreatList(LinkList &L){
L->elem=0;
LinkList p=L;//p指向线性表L
LinkList q;//定义q
for(int i=1;i<=10;i++){
q=(LinkList)malloc(sizeof(LNode));//q为线性表的一个节点
q->elem=i;//q的值为i
q->next=NULL;//q的下一个节点赋为空
p->next=q;//p的下一个节点指向q
p=q;//将q节点赋给p
q=p->next;//将p的下一个节点赋给q,即NULL(现在的p即上面的q节点)
}
return 1;
}
//头插法逆置链表
int HeadInsertList(LinkList &L){
LinkList p,q;
p=L->next;//将L指向的下一个节点赋给p防止链表丢失
q=p;//将p赋给q
L->next=NULL;//断开链表
while(q){//当q不为空则循环
q=p->next;//将p的下一个节点赋给q
p->next=L;//将L赋给p的下一个节点,即把p节点插入到L的前面
L=p;//将L前移到p
p=q;//将p后移到q
}
return 1;
}
//遍历链表并输出
void VisitList(LinkList L){
LinkList p=L;
while(p){
cout<<p->elem<<",";
p=p->next;
}
cout<<endl;
}
int main(){
LinkList L;//建立链表结构体
InitList(L);//定义链表
CreatList(L);//尾插法创建链表
VisitList(L);//遍历链表并输出
HeadInsertList(L);//头插法逆置链表
cout<<endl;
VisitList(L);//遍历链表并输出
}
运行结果如下: