数据结构 每日一练:将带头结点的单链表就地逆置(视频讲解两种方法)

目录

方法一

算法视频分析

方法二

算法视频分析


Q:什么是"就地"捏?

A:就是指辅助空间复杂度为O(1),通俗一点来说就是不需要再开辟一块空间来实现算法。

特别说明:

笔者第一次录制视频,言语有些不顺,还望大家见谅!如有错误,请大家指出。

方法一

头插法,将头结点摘下来,然后从第一结点开始,一次插入到头结点后面(头插法建立单链表),直到最后一个结点为止。

复制代码
LinkList Reverse_1(LinkList L)
{
	LNode* p, * r;         //p为工作指针,r为p的后继,以防止出现断链
	p = L->next;           //从第一个元素结点开始
	L->next = NULL;        //先将头结点L的next域置为NULL
	while (p != NULL)      //依次将元素结点断开
	{
		r = p->next;       //存放p的后继
		p->next = L->next; //将p结点插入到头结点之后
		L->next = p;
		p = r;
	}
	return L;
}

算法视频分析

方法二

假设pre,p和r指向3个结点。经过若干操作之后,*pre之前的结点的指针都已经调整完毕,它们的next都指向其原前驱节点。现在令*p结点的next域指向*pre结点,注意到一旦调整指针的指向,*p的后继结点就会断开,因此需要用r来指向原*p的后继结点。注意两点:一是再处理第一个结点时,应将其next域置为NULL ,而不是指向头结点(因为它将作为新表的尾结点);二是处理完最后一个结点后,需要将头结点的指针指向它。

复制代码
LinkList Reverse_2(LinkList L)
{
	LNode* pre, * p = L->next, * r = p->next;
	p->next = NULL;         //处理第一个结点
	while (r != NULL)       //r为空的时候说明是最后一个结点
	{
		pre = p;            //依次遍历
		p = r;
		r = r->next;
		p->next = pre;      //指针反转
	}
	L->next = p;            //处理最后一个结点
	return L;
}

算法视频分析

相关推荐
小龙报8 分钟前
算法通关指南:数据结构和算法篇 --- 队列相关算法题》--- 1. 【模板】队列,2. 机器翻译
c语言·开发语言·数据结构·c++·算法·学习方法·visual studio
晨非辰25 分钟前
【数据结构初阶】--从排序算法原理分析到代码实现操作,参透插入排序的奥秘!
c语言·开发语言·数据结构·c++·算法·面试·排序算法
三川6981 小时前
排序算法介绍
数据结构·算法·排序算法
智驱力人工智能6 小时前
基于视觉分析的人脸联动使用手机检测系统 智能安全管理新突破 人脸与手机行为联动检测 多模态融合人脸与手机行为分析模型
算法·安全·目标检测·计算机视觉·智能手机·视觉检测·边缘计算
2301_764441336 小时前
水星热演化核幔耦合数值模拟
python·算法·数学建模
循环过三天7 小时前
3.4、Python-集合
开发语言·笔记·python·学习·算法
priority_key9 小时前
排序算法:堆排序、快速排序、归并排序
java·后端·算法·排序算法·归并排序·堆排序·快速排序
不染尘.9 小时前
2025_11_7_刷题
开发语言·c++·vscode·算法
来荔枝一大筐10 小时前
力扣 寻找两个正序数组的中位数
算法
算法与编程之美11 小时前
理解Java finalize函数
java·开发语言·jvm·算法