<span style="font-family: Arial, Helvetica, sans-serif;">//单链表的逆置,新建链表(头插法实现)</span>
#include <iostream>
#include <iomanip>
using namespace std;
typedef struct Node
{
int data;
struct Node* next;
}Node,*LinkList;
//新建一个链表利用头插法向里查,实现逆置
LinkList Linlist_Inverse(LinkList L)
{
if (NULL==L)
{
cout<<"There is no node!"<<endl;
}
if (NULL==L->next)
{
cout<<"The linklist is empty"<<endl;
}
LinkList L1=(LinkList)malloc(sizeof(Node));//用于存放逆置好的链表
L1->next=NULL;//初始化
LinkList temp=L->next;//实现各个元素的逆置,复制
while(NULL!=temp->next)//实现前n-1个节点的逆置
{
//int num=temp->data;
LinkList s=(LinkList)malloc(sizeof(Node));//用于向新表中插入节点
s->data=temp->data;
s->next=L1->next;
L1->next=s;
temp=temp->next;
}
if (NULL==temp->next)
{
LinkList s=(LinkList)malloc(sizeof(Node));//用于向新表中插入节点
s->data=temp->data;
s->next=L1->next;
L1->next=s;
}
return L1;
}
//单链表的建立,从键盘输入数据
//0作为数据输入停止符
//按数据输入的先后进行链接
LinkList Creat_linklist()
{
int cycle=1;//用于控制循环
LinkList L=(LinkList)malloc(sizeof(Node));//建立的新链表
LinkList temp=L;//指向链表的尾接点
if(NULL==L)
{
cout<<"Failed to malloc a new Linklist!";
return NULL;
}
L->next=NULL;//建立空的头结点
while(cycle)
{
int data;//用于存放键盘中输入的数据
cout<<"Please input the data:"<<endl;
cin>>data;
if(data!=0)
{
LinkList s=(LinkList)malloc(sizeof(Node));
s->data=data;//新建节点赋初值
s->next=NULL;
temp->next=s;//建立链接,更新链表
temp=temp->next;
}
else
{
cycle=0;
}
}
return L;
}
//单链表的打印
void Print_Linklist(LinkList L)
{
if(NULL==L)
{
cout<<"There is no node!"<<endl;
}
if (NULL==L->next)
{
cout<<"The linklist is empty!"<<endl;
}
LinkList temp;
cout<<"链表的打印:"<<endl;
for (temp=L->next;NULL!=temp->next;temp=temp->next)
{
cout<<setw(3)<<temp->data<<"->";
}
cout<<setw(3)<<temp->data;
cout<<endl;
}
int main()
{
LinkList L=Creat_linklist();
Print_Linklist(L);
LinkList L1=Linlist_Inverse(L);
Print_Linklist(L1);
return 0;
}
//在原链表上,借用指针,逐个实现逆转,具体参见代码//逐个逆转
//逐个逆转
LinkList Linlist_Inverse(LinkList L)
{
if (NULL==L)
{
cout<<"There is no node!"<<endl;
return L;
}
if (NULL==L->next)
{
cout<<"The linklist is empty"<<endl;
return L;
}
LinkList p1,p2;//用于实现逆转
p1=L->next;//用于指向逆转完的最后一个节点
p2=p1->next;//用于指向待逆转的元素
while (NULL!=p2)
{
//完成待逆转元素逆转
p1->next=p2->next;
p2->next=L->next;
L->next=p2;
//修改指针
p2=p1->next;
}
return L;
}