单链表逆置(头插法,递归,数据结构栈的应用)

本文介绍了三种方法实现链表逆置:头插法通过逐个节点插入逆置链表头部;递归方式通过改变节点链接指向达到逆置;利用栈存储结构,先存入所有节点值,然后逆序输出。
摘要由CSDN通过智能技术生成

链表逆置就是把最后一个数据提到最前面,倒数第二个放到第二个……依次类推,直到第一个到最后一个。
由于链表没有下标,所以不能借助下标来实行数据的逆置,要靠空间的转移来完成链表的逆置,这里采用没有头节点的链表来实现逆置。

第一种——头插法

算法思想:逆置链表,初始为空,表中节点从原链表中依次“删除”,再逐个插入逆置链表的表头(即“头插”到逆置链表中),使它成为逆置链表的“新”的第一个结点,如此循环,直至原链表为空。

代码实现:

#include<iostream>
using namespace std;//单链表逆置 
typedef int type;
typedef struct link{
	type data;
	struct link *next;
}link,*list;
int main(){
	list head=new link;
	head->next=NULL;
	link *p,*r=head;
	int x;
	cout<<"请决定为单链表输入几个数值: "; 
	cin>>x;
	for(int i=0;i<x;i++){
		p=new link;
		cout<<"请输入第"<<i+1<<"个数值:"; 
		cin>>p->data;
		p->next=r->next;
		r->next=p;
		r=p;
	}
	cout<<"单链表的内容为: ";
	p=head->next;
	for(int i=0;i<x;i++){
		cout<<p->data<<"  ";
		p=p->next; 
	}
	link *q;
	p=head->next;
	head->next=NULL;
	while(p!=NULL){
		q=p;
		p=p->next;
		q->next=head->next;
		head->next=q;
	}
	cout<<endl<<"单链表的内容为: ";
	p=head->next;
	for(int i=0;i<x;i++){
		cout<<p->data<<"  ";
		p=p->next; 
	}
	return 0;
}

运行结果:

第二种——递归

代码实现:

#include<iostream>
using namespace std;//单链表逆置 
typedef int type;
typedef struct link{
	type data;
	struct link *next;
}link,*list;
link* traverse(list head);
int main(){
	link *p,*r,*head;
	int x;
	cout<<"请决定为单链表输入几个数值: "; 
	cin>>x;
	p=new link;
	cout<<"请输入第"<<1<<"个数值:"; 
	cin>>p->data;
	p->next=NULL;
	head=p;
	r=head;
	for(int i=1;i<x;i++){
		p=new link;
		cout<<"请输入第"<<i+1<<"个数值:"; 
		cin>>p->data;
		p->next=r->next;
		r->next=p;
		r=p;
	}
	cout<<"单链表的内容为: ";
	p=head;
	for(int i=0;i<x;i++){
		cout<<p->data<<"  ";
		p=p->next; 
	}
	head=traverse(head);
	cout<<endl<<"单链表的内容为: ";
	p=head;
	for(int i=0;i<x;i++){
		cout<<p->data<<"  ";
		p=p->next; 
	}
	return 0;
}
link* traverse(list head){
	if(head->next==NULL){
		return head;
	}
	link *p=traverse(head->next);
	head->next->next=head;
	head->next=NULL;
	return p;
}

运行结果:
第三种——利用栈存储结构

#include<iostream>
using namespace std;//单链表逆置 
typedef int type;
typedef struct link{
	int data;
	struct link *next;
}link,*list;
int main(){
	list s=NULL;
	link *p;
	int x;
	int *a=new int[100];
	cout<<"请决定为单链表输入几个数值: "; 
	cin>>x;
	for(int i=0;i<x;i++){
		p=new link;
		cout<<"请输入第"<<i+1<<"个数值:"; 
		cin>>p->data;
		a[i]=p->data;
		p->next=s;
		s=p;
	}
	cout<<"单链表的内容为: ";
	for(int i=0;i<x;i++){
		cout<<a[i]<<"   "; 
	}
	cout<<endl<<"逆置后单链表的内容为: ";
	for(int i=0;i<x;i++){
		p=s;
		cout<<p->data<<"  ";
		s=s->next;
		delete p;
	}
	return 0;
}

运行结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

杰克尼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值