当前位置: 首页 > article >正文

链表逆置相关算法题|原地逆置|轮转链表|循环链表逆置(C)

原地逆置

试编写算法将带头结点的单链表就地逆置,所谓“就地”是指辅助空间复杂度为O(1)。

思路1

将头节点摘下,然后从第一节点开始,依次插入到头节点后面,头插法建立单链表,直到最后一个节点为止
![[Pasted image 20241102200949.png]]

断开L和链表
![[Pasted image 20241102201609.png]]

将cur的next指向L的next
![[Pasted image 20241102201650.png]]

将L的next指向cur
![[Pasted image 20241102201710.png]]

完成插入,将cur指向next,next指向cur的next
![[Pasted image 20241102201756.png]]

LinkList ReverseL(LinkList &L)
{
	LNode* cur, *next;
	cur = L->next;
	L->next = NULL;
	while (cur)
	{
		next = cur->next;
		cur->next = L->next;
		L->next = cur;
		cur = next;
	}
	return L;
}

一个工作指针cur用来遍历链表,一个后继指针next用来保存cur的下一个节点
cur指向第一个节点,将哨兵位的next置为NULL,与后面的链表断开链接
cur往后遍历,直到cur指向NULL
将next指向cur的next,保存下一个节点
将cur的next指向哨兵位的next,将cur节点插入到哨兵节点之后
将L的next指向cur,将哨兵节点和当前节点进行链接
将cur指向next,继续往后遍历
最后返回链表L

思路2

用三个指针prev,cur,next来表示三个连续的节点
![[Pasted image 20241102202556.png]]

处理第一个节点,cur的next指向NULL
![[Pasted image 20241102202627.png]]

prev指向cur,cur指向next,next指向next的next
![[Pasted image 20241102202731.png]]

cur的next指向prev
![[Pasted image 20241102202824.png]]

直到next指向NULL
![[Pasted image 20241102202924.png]]

![[Pasted image 20241102203014.png]]

最后将L的next指向cur节点,也就是原来的尾节点
![[Pasted image 20241102203056.png]]

完成逆置

LinkList ReverseL(LinkList &L)
{
	LNode* prev, *cur = L->next, *next = cur->next;
	cur->next = NULL;
	while (next)
	{
		prev = cur;
		cur = next;
		next = next->next;
		cur->next = prev;
	}
	L->next = cur;
	return L;
}

一个工作指针cur用来遍历链表,一个后继指针用来保存cur的下一个节点,一个前驱指针prev用来保存前一个节点
cur指向L的next,从第一个节点开始
将当前遍历的节点的next指向NULL
开始遍历:
将prev指向cur,cur指向next,next指向next的下一个,三个指针往后走一步
将cur的next指向perv,将中间节点的next指向前一个节点
直到第三个节点指向NULL,也就是最后一个节点的next指向倒数第二个节点
最后将L的next指向cur,也就是哨兵位头节点指向最后一个节点,完成逆置
返回链表L

轮转链表

设将n ( n > 1 ) (n>1) (n>1)个整数存放到不带头结点的单链表L中,将L中保存的序列循环右移k ( 0 < k < n ) (0<k<n) (0<k<n)个位置。例如,若k=1,则将链表{0,1,2,3}变为{3,0,1,2}。

算法思想

首先,遍历链表计算表长n,并找到链表的尾节点,将其与头节点相连,构成一个循环单链表
然后找到新链表的尾节点,为原链表的第n-k个节点,令L指向新链表尾节点的下一个节点,并将环断开,得到新链表

LinkList* Converse(LinkList &L, int k)
{
	int n = 1;
	LNode* cur = L;
	while (cur->next)
	{
		cur = cur->next;
		n++;
	}
	cur->next = L;
	for (int i = 1; i <= n - k; i++)
	{
		cur = cur->next;
	}
	L = cur->next;
	cur->next = NULL;
	return L;
}

将n初始化为1,cur指向L,cur的next指向第一个节点,往后遍历直到cur的next指向NULL,cur指向最后一个节点
![[Pasted image 20241103143517.png]]

![[Pasted image 20241103143537.png]]

![[Pasted image 20241103143555.png]]

![[Pasted image 20241103143624.png]]

再下一次cur->next指向NULL,不进入循环
这样遍历出链表的节点个数
![[Pasted image 20241103143740.png]]

将cur的next指向L
![[Pasted image 20241103144736.png]]

构成循环链表
若k=1,也就是要右移一个位置
新链表的尾节点也就是第n-k个节点,也就是第4-1=3个节点
从头遍历依次,找到第n-k个节点,用cur指针指向
![[Pasted image 20241103144754.png]]

令L指向新链表尾节点的下一个节点
![[Pasted image 20241103144813.png]]

将cur的next指向NULL,断开环
![[Pasted image 20241103144829.png]]

完成右移

循环链表逆置

与逆置单链表的不同之处:

  1. 初始化成循环链表而不是空链表
  2. 判断链表尾不用空指针而用是否是链表头指针
    ![[Pasted image 20241103151328.png]]
void reverse(LinkList &L)
{
	LNode* cur = L->next, *next;
	L->next = L;           //初始化成空循环链表

	while (cur != L)       //当cur等于L时结束
	{
		next = cur->next;  //暂存cur的后继节点
		cur->next = L->next;
		L->next = cur;
		cur = next;
	}
	return L;
}

让L的next指向自己,循环链表的初始化
![[Pasted image 20241103151354.png]]

用next指针指向cur的下一个节点
![[Pasted image 20241103151503.png]]

将cur的next指向L的next
![[Pasted image 20241103151536.png]]

L的next指向cur
![[Pasted image 20241103151630.png]]

cur指向next
![[Pasted image 20241103151650.png]]

![[Pasted image 20241103151717.png]]

![[Pasted image 20241103151750.png]]

直到cur指向L
完成逆置


http://www.kler.cn/a/378505.html

相关文章:

  • 鸿蒙HarmonyOS开发:给应用添加基础类型通知和进度条类型通知(API 12)
  • el-upload,上传文件,后端提示信息,前端需要再次重新上传(不用重新选择文件)
  • Linux和,FreeRTOS 任务调度原理,r0-r15寄存器,以及移植freertos(一)
  • 【逆向基础】十八、PE文件格式(三)
  • 适用于 c++ 的 wxWidgets框架源码编译SDK-windows篇
  • pip install -r requirements.txt下载速度慢
  • vscode markdown-image 图片粘贴自动上传到本地目录设置
  • 11月3日笔记(根据凭据提权)
  • Manus Metagloves Pro虚拟现实手套
  • java项目之协力服装厂服装生产管理系统的设计与实现(springboot)
  • Spring Boot框架下的信息学科平台系统架构设计
  • AG32的3个ADC可以并联使用吗
  • 【工具变量】“宽带中国”试点城市名单匹配数据集(2000-2023年)
  • 基于海思soc的智能产品开发(产品开发和mpp平台)
  • ️ 数据库迁移过程中可能遇到哪些常见问题?
  • 高频面试题基本总结回顾(含笔试高频算法整理)11
  • 【K8S系列】Kubernetes 中 Pod 无法通过 Service 名称访问服务的 DNS 解析失败问题【已解决】
  • Redis有什么不一样?
  • 【iOS】SDWebImage
  • 高效处理数据的一把钥匙:探索MySQL事务机制
  • Linux 练习三
  • scp免密上传文件
  • 华为OD机试 - 字符串分割(二) - 双指针(Python/JS/C/C++ 2024 C卷 100分)
  • [ vulnhub靶机通关篇 ] 渗透测试综合靶场 Corrosion1 通关详解 (附靶机搭建教程)
  • 基于Spring Boot + Vue的气象智慧监测系统设计与实现
  • python读word中的表格和插入表格