算法思想:用数组进行反转,然后再来加到链表中
//这里使用对的数组反转来进行逆置
#include<stdio.h>
#include<stdlib.h>
//反向输出每个节点的值,带头节点的单链表
typedef struct Lnode{
int data;//数据域
struct Lnode *next;//指针域
}Lnode,*LinkList;
int a[7]={1,2,3,4,5,6};
int n=6;
//链表首先就要初始化,如何让数组转化为链表
void InitList(Lnode *L){//尾插法把数组中的元素转化为链表
Lnode *s,*r=L;//r初始指向L,r为尾指针
r->data=a[0];
if(n==1) r->next=NULL;
else {
for(int i=1;i<n;i++){
s=(Lnode *)malloc(sizeof(Lnode));
s->data=a[i];
r->next=s;
r=s;
}
}
依次添加完了,要把下r->next必须指向空
r->next=NULL;
}
void PrintList(Lnode *L){
Lnode *s=L;
while(s!=NULL){
printf("%d",s->data);
s=s->next;
}
printf("\n");
}
//逆置的操作
void reverse(int a[],int start,int end){
//逆置数组
for(int i=start;i<=(start+end)/2;i++){
int temp=a[i];
a[i]=a[start+end-i];
a[start+end-i]=temp;
}
}
int main(){
Lnode list;
Lnode *L=&list;//指针初始化和引用
InitList(L);
PrintList(L);
reverse(a,0,5);
InitList(L);
PrintList(L);
return 0;
}
下面给出第二种解法:使用栈的性质,了解过栈的会知道栈是先进后出,这里就可以使用栈的性质来反转链表,递归就是栈的一种应用,所以这里就使用递归来反转链表,下面给出递归的算法
#include<stdio.h>
#include<stdlib.h>
//反向输出每个节点的值,带头节点的单链表
typedef struct Lnode{
int data;//数据域
struct Lnode *next;//指针域
}Lnode,*LinkList;
int a[7]={1,2,3,4,5,6};
int n=6;
//链表首先就要初始化,如何让数组转化为链表
void InitList(Lnode *L){//尾插法把数组中的元素转化为链表
Lnode *s,*r=L;//r初始指向L,r为尾指针
r->data=a[0];
if(n==1) r->next=NULL;
else {
for(int i=1;i<n;i++){
s=(Lnode *)malloc(sizeof(Lnode));
s->data=a[i];
r->next=s;
r=s;
}
}
依次添加完了,要把下r->next必须指向空
r->next=NULL;
}
不带头节点的情况
//void PrintList(Lnode *L){
// if(L!=NULL){
// PrintList(L->next);
// printf("%d",L->data);
// }
//
//}
//带都节点的情况
void PrintList(Lnode *L){
if(L->next!=NULL){
PrintList(L->next);//带头节点的情况需要注意,就是指向最后一个元素的时候
//他的下一个为空,就不会再进行if语句,所以要把if(L!=null)单独写在外面来,不然会少打印一个值
//最后那个值
}
if(L!=NULL) printf("%d",L->data);
}
int main(){
Lnode list;
Lnode *L=&list;//指针初始化和引用
InitList(L);
PrintList(L);
return 0;
}
有兴趣的小伙伴还可以用栈的基本操作函数来实现