通过题目我们知道这个题需要使用链表方面的知识,首先对链表不熟悉的小伙伴们可以先去复习一下链表,了解一下单链表的各种基础操作。要实现链表的逆置,我第一时间想到的就是栈,因为栈的特点就是先入后出,想到就去实现。
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; //遍历新链表
}
}
这里用到了栈的特点,限制单链表每次插入的时候都要在头结点的后面进行插入,构成了一个新链表,遍历新链表,这样就完成了链表的逆置操作。
这次平台让我通过了,嘿嘿,真好!