单链表逆置-新建链表(头插法实现)/原链表(逐个实现逆转)

<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;
}
 

                
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值