栈的链表逆置

在这里插入图片描述
通过题目我们知道这个题需要使用链表方面的知识,首先对链表不熟悉的小伙伴们可以先去复习一下链表,了解一下单链表的各种基础操作。要实现链表的逆置,我第一时间想到的就是栈,因为栈的特点就是先入后出,想到就去实现。

typedef struct lnode{
    
    
	int data;		//定义单链表 
	lnode *next;
}lnode,*list;

typedef关键字是给数据类型取别名的意思,后面的list指针是为了让后面使用起来更方便,不需要每次都定义指针了。

void lt(list &l){
    
    	//通过引用对头节点导出 
	int x;
	l=(list)malloc(sizeof(lnode));
	lnode *s,*r=l;
	cin>>x;
	while(x!=-1){
    
    			//输入数据,输入-1时退出循环 
		s=(list)malloc(sizeof(lnode));
		s->data=x;
		r->next=s;				
		r=s;
		cin>>x;
	}
	r->next=NULL;	//将尾节点的next值赋空值 
}

这是通过用户输入构建单链表,利用-1作为终止条件,别忘了最后给尾节点的指针域赋空值哈!(使用malloc分配空间时不要忘记引入头文件)#include<malloc.h>
具体的构建方法用文字也不大好说清楚,要是大家看不明白的话,可以去哔哩哔哩看一下王道考研的数据结构,那里有详细的讲解。
在这里插入图片描述

int main(){
    
    
	list l;
	lt(l);	//调用方法传入头结点 
	lnode *s;
	s=(list)malloc(sizeof(lnode));
	lnode *p;
	p=(list)malloc(sizeof(lnode));
	s->next=p;
	p->data=l->next->data;
	l=l->next;
	p->next=NULL;		//到这一步是将头结点与尾节点赋值链接 
	while(l->next!=NULL){
    
    
		lnode *r;
		r=(list)malloc(sizeof(lnode));
		r->next=p;
		r->data=l->next->data;		//利用了栈的先进后出的特点,限制数据只允许在头结点后面进行插入,构成新的链表 
		p=s->next=r;
		l=l->next;
	}
	while(s->next!=NULL){
    
    
		cout<<s->next->data<<" ";
		s=s->next;					//遍历新链表 
	}
	
}

这里用到了栈的特点,限制单链表每次插入的时候都要在头结点的后面进行插入,构成了一个新链表,遍历新链表,这样就完成了链表的逆置操作。
在这里插入图片描述
这次平台让我通过了,嘿嘿,真好!

猜你喜欢

转载自blog.csdn.net/xszdbc/article/details/109324979
今日推荐