单链表的逆置
此处介绍两种逆置方法
- 如果有两个及以上节点(不包含头结点),则将从第二个节点开始进行头插法
- 用指针的指向来进行逆置
链表先进行初始化
#include<stdio.h>
#include<stdlib.h>
typedef struct LNode{
int data;
struct LNode* next;
}LNode;
LNode* Createlist(int length)//尾插法建立链表
{
LNode* L=(LNode*)malloc(sizeof(LNode));
L->next=NULL;
LNode* p=L;
for(int i=0;i<length;i++)
{
LNode* t=(LNode*)malloc(sizeof(LNode));
t->next=NULL;
scanf("%d",&t->data);
p->next=t;
p=t;
}
return L;
}
void scan(LNode* L)//输出链表各个元素的值
{
LNode* p=L->next;
while(p)
{
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}
用插入的方法逆置
void reverse(LNode* L)//利用头插法逆序
{
if(L->next->next)//如果有两个及以上的节点则逆置,否则不用
{
LNode *p=L->next;//标记第一个元素
L->next=NULL;//将头节点断开
while(p)//依次进行插入
{
LNode* q=p;
p=p->next;
q->next=L->next;
L->next=q;
}
}
}
用指针指向的改变来逆置
void reverse_s(LNode* L)//利用指针的指向逆序
{
if(L->next->next)
{
LNode* p=L->next;
LNode* q=p->next;//分别标记第一个和第二个元素
while(q)
{
LNode* r=q->next;//用r标记后面的元素,防止指针改变而导致链表之后的丢失
q->next=p;
p=q;
q=r;
}
L->next->next=NULL;
L->next=p;让头节点指向最后一个元素
}
}