设计一算法,对单链表实现就地逆置

对单链表逆置,要联想到单链表的头插性质
举个例子:现在有一个空链表,我们依次对它进行头插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;
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

劲夫学编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值