对单链表逆置,要联想到单链表的头插性质
举个例子:现在有一个空链表,我们依次对它进行头插123
那么形成的链表是321,这样就形成了逆置
//单链表就地逆置
//思路:把原表接到一个新表上,然后对原表进行头插
void YuanDiNiZhi(LinkList* L) {
LinkList tmp = (*L)->next;//把L接到tmp上
(*L)->next = NULL;
//接下来对L进行头插即可完成逆置
LNode* p =tmp;//用p遍历tmp
while (p != NULL) {
tmp= p->next;
p->next = (*L)->next;
(*L)->next = p;
p = tmp;//p复位
}
}
int main()
{
LinkList L;
InitList2(&L);//初始化一个带头结点的单链表1,2,3,4,5,6,7,8,9,10
printf("初始链表为:");
print2(L);
YuanDiNiZhi(&L);
printf("\n逆置后链表为:");
print2(L);
}
注:带头结点链表初始化及打印函数
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdbool.h>
#include<malloc.h>
//单链表定义
//链表结点
int A[10] = { 1,2,3,4,5,6,7,8,9,10 };
int B[6] = { 4,7,8,9,11,13 };//4,7,8,9,11,13
typedef struct {//定义单链表结点类型
int data;//数据域
struct LNode *next;//指针域
}LNode, *LinkList;
//带头结点初始化-尾插法
void InitList2(LinkList* L) {
(*L) = (LNode*)malloc(sizeof(LNode));
(*L)->next = NULL;
LNode* rear = (*L);//标记表尾
int i = 0;
for (i = 0;i < 10;i++) {
LNode* p = (LNode*)malloc(sizeof(LNode));//创建一个新结点
p->data = A[i];//新结点赋值
rear->next = p;//接到L上
rear = p;//标记表尾
}
rear->next = NULL;
}
void print2(LinkList L) {//打印带头结点的链表
LNode* i = L->next;//用i指针遍历整个链表
while (i != NULL) {
printf("%d ", i->data);
i = i->next;
}
}