数据结构基础(链表)

重温四大基础数据结构:数组、链表、队列和栈 前言 本文收录于专辑:http://dwz.win/HjK,点击解锁更多数据结构与算法的知识。 你好,我是彤哥,一个每天爬二十六层楼还不忘读源码的硬核男人。 数组、链表、队列、栈,是数据结构中最基础的四大结构,数组和链表更是基础中的基础,后续所有复杂的数据结构都是在它们的基础上演变而来的。 本节,我们就来重温这四大结构。 数组 关于数组,大家都比较熟悉了。 它是一种线性数据结构,使用一组连续的内存空间存储一组具有相同类型的数据。 这个概念中有三个关键词:线性、连续、相同类型。 线性,表示没有分叉,任. 阅读详情

链表的定义:

typedef int DataType;

typedef struct ListNode
{
        Datatype data;
        struct ListNode* next;
}ListNode;

递归实现链表的逆序打印

 

void Reverse(ListNode *pList)//递归实现逆序打印
{
        if(pList == NUll)
        {
                return;
        }
        else if(pList != NULL)
        {
                Reverse(pList->next);
                printf("%d-->",pList->data);
        }
}

删除无头结点的非尾节点

 

 

void RemoveNotHead(ListNode **ppList,Datatype x)//删除无头链表的非尾节点
{
        ListNode *del = NULL;
        ListNode *cul = Find(*ppList,x);
        assert(ppList);
        if(cur==NULL)
        {
                return
        }
        del = cur->next;
        cur->data = del->data;
        cur->next = del->next;
        free(del);
}

 在无头单链表的一个节点前插入一个节点

void InsertNonFront(ListNode *pos,DataType x)//在无头单链表的一个节点前
插入一个节点
{
        ListNode *cur = pos->next;
        ListNode *tmp = BuyNode(x);
        DataType _tmp;
        assert(pos);
        pos->next = tmp;
        tmp->next = cur;
        _tmp = pos->data;
        pos->next = tmp->data;
        tmp->data = -tmp;

}

逆置单链表

 

 

ListNode *_Reverse(ListNode *pList)//逆转链表
{
        ListNode *NewList = NUll;
        ListNode *cur = pList;
        while(cur)
        {
                //1.摘节点
                ListNode *tmp = cur;
                cur = cur->next;
                //2.头插
                tmp->next = NewList;
                NewList = tmp;
        }
        return NewList;
}

约瑟夫环

 

 ListNode *JosephRing(ListNode *list,int k)
 {
         ListNode *cur = list;
         int count = k;
         ListNode *Next = cur->next;
         if(list == NULL)
         {
                 return;
         }
         while(cur->next!=cur)
         {
                 while(--count)
                 {
                         cur = cur->next;
                 }
                 cur->data = Next->data;
                 cur->next = Next->next;
                 free(next);
         }
         return cur;
 }

 链表的冒泡排序

void BubbleSortList(ListNode *pList)//对链表进行冒泡排序
{
        ListNode *cur = plist;
        ListNode *tail = NUll;
        if((cur == NUll)||(cur->next == NUll))
        {
                return;
        }
        while(cur->next!=tail)//总趟数
        {
                while(cur->next!=tail)
                {
                        if((cur->data) > (cur->next->data))
                        {
                                DataType tmp = cur->data;
                                cur->data = cur->next->data;
                                cur->next->data = tmp;
                        }
                        cur = cur->next;
                }
                tail = cur;
                cur = pList;
        }
}

 找中间节点

 

 ListNode *FindMidNode(ListNode *pList)//找中间节点
 {
         ListNode *fast = pList;
         ListNode *slow = pList;
         if(pList == NULL)
         {
                 return;
         }
         while(fast!=NULL&&fast->next!=NUll)
         {
                 fast = fast->next->next;//双指针,快指针走两步,慢指针走一步
                 slow = slow->next;
         }
         return slow;
 }

有序合并

 

 ListNode *Merge(ListNode *ppl1,ListNode *ppl2)//有序链表合并
 {
         ListNode *head = NULL;
         ListNode *cur = NULL;
         assert(ppl2!=NULL);
         assert(ppl1!=NULL);

         if((*ppl1)->data<(*ppl2)->data)
         {
                 head = *ppl1;
                 cur = head;
                 *ppl1 = (*ppl1)->next;
         }else
         {
                 head = *ppl2;
                 cur = head;
                 *ppl2 = (*ppl2)->next;
         }
         while((*ppl11=NULL)&&(*ppl2!=NULL))
         {
                 if((*ppl1)->data<(*ppl2)->data)
                 {
                         cur->next = *ppl1;
                         *ppl1 = (*ppl1)->next;
                 }
                 else
                 {
                         cur->next = *ppl2;
                         *ppl2 = (*ppl2)->next;
                 }
                 cur = cur->next;
         }
         if(*ppl1!=NULL)
         {
                 cur->next = *ppl1;
         }
         else if(*ppl2!=NULL)
         {
                 cur->next = *ppl2;
         }
         return head;
 }

 判断链表是否有环

ListNode *IsCycle(ListNode *pList)//判断是否带环
{
        ListNode *slow = pList;
        ListNode *fast = pList;
        while(fast&&fast->next)
        {
                slow = slow->next;
                fast = fast->next->next;//快指针走两步,慢指针走一步
                if(fast==slow) return fast;//若存在环则两指针会相遇
        }
        return NULL;
}

求环的长度

int GetCycleLength(ListNode *Meet)//求环长度
{
        ListNode *meet = NULL;
        int count = 0;
        if(Meet == NULL)
        {
                return count;
        }
        meet = IsCycle(Meet);
        Meet = meet;
        meet = meet->next;
        count++;
        while(meet != Meet)//从相遇节点开始,知道下次相遇即为环的长度
        {
                count++;
                meet = meet->next;
        }
        return count;
}

求环的入口

 定义两个指针,一个指针从链表开始出发,另一个指针从相遇点出发,两个指针再次相遇的点就是入口点

ListNode *GetCircleEntryNode(ListNode *meet,ListNode *plist)//求环的入口点
{
        ListNode *first = meet;
        ListNode *second = plist;
        if((plist == NULL)||(meet == NULL))//一个指针从链表开始,另一个从相遇点出发,两个指针再次相遇的点就是入口点
                return NULL;

        while(first != second)
        {
                first = first->next;
                second = second->next;
        }
        return first;
}

 判断两个环是否相交

先比较两个链表,找出长链表,定义两个指针,先让一个指针从长链表走相差步,另一个指针再从短链表走,当两个链表同时指向同一个节点,带节点为相交点

ListNode *GetCrossNode(ListNode *l1,ListNode *l2)//判断两环是否相交
{
        int len1 = 0;
        int len2 = 0;
        ListNode *cur1 = l1;
        ListNode *cur2 = l2;
        ListNode *shortlist,*longlist;
        if(cur == NULL||cur1 == NULL)
                return NULL;
        while(cur1)
        {
                len1++;
                cur1 = cur1->next;
        }
        while(cur2)
        {
                len2++;
                cur2 = cur2->next;
        }
        shortlist = l2;
        longlist = l1;
        if(len2 > len1)
        {
                shortlist = l1;
                longlist = l2;
        }

        int gap = abs(len1-len2);
        while(gap--)
        {
                longlist = longlist->next;
        }
        while(shortlist != longlist)
        {
                shortlist = shortlist->next;
                longlist = longlist->next;
        }
}

删除倒数第K个数

 

void DelLinkList(ListNode *pList, int k)//删除倒数第K个节点
{
        ListNode *fast = pList;
        ListNode *slow = pList;
        ListNode *Del = NULL;
        if(pList == NULL)return;
        while((fast != NULL)&&(fast->next != NULL))
        {
                while(--k>0)
                {
                        Del = fast;//fast先走K步之后slow走,直达fast走到链表结尾
                        fast = fast->next;
                }
                fast = fast->next;
                slow = slow->next;
        }
        Del = slow->next;
        slow->data = Del->data;
        slow->next = Del->next;
        free(Del);
        Del = NULL;
}

 

PCIe Crosslink PCIe Crosslink(交叉连接)是一种特殊的PCIe链路连接方式,允许两个PCIe设备(通常是Root Complex或Endpoint)是指两个PCIe设备(如两个CPU、两个FPGA或两个GPU)通过PCIe链路直接连接,形成点对点(P2P)通信通道。:两个Intel/AMD CPU通过PCIe Crosslink直接通信(替代UPI/Infinity Fabric)。:主板需提供PCIe Crosslink连接(如特定插槽支持x16/x8 Crosslink)。 阅读详情

相关推荐

QCM6490平台DDR测试:从QDUTT配置到眼图分析的实战指南

本文详细介绍了QCM6490平台DDR测试的全流程,从QDUTT工具安装配置到眼图分析,提供了实战操作指南和常见问题解决方案。通过具体案例分享,帮助工程师掌握DDR测试技巧,确保内存稳定性,特别适用于物联网和边缘计算设备的开发调试。

weixin_33910191的博客 459

数据结构(C语言篇):(四)链表

本文详细介绍了单链表的基本概念、结构实现与核心操作算法。单链表是一种非连续存储结构,通过指针链接实现元素的逻辑顺序。文章首先阐述了结点的组成和链表的性质,然后重点讲解了单链表的10种核心操作函数实现,包括插入、删除、查找等,并分析了各操作的时间复杂度。最后对链表的8种分类结构进行了概述,指出无头单向非循环链表和带头双向循环链表是最常用的两种结构。

2301_79248256的博客 1164

Labview程序框架介绍

当掌握LabVIEW基础知识并达到,理解单个小型模块程序会相对轻松。而若想进一步探索大型程序,就必然需要了解程序框架相关内容。LabVIEW常用的程序架构包括等。在多年工作中,我接触过的众多高级工程师所开发的大型程序,基本都基于这些架构搭建。接下来,将为大家详细介绍这些框架。

Misterlhw的博客 4620

链表知识总结

链表知识总结

fyzxl的博客 899

HighTec安装(官网免费)编译 嘎嘎详细~

安装软件最好有自己的一套安装规则,工程软件除了安装主体外还会有很多其他的东西,比如license或者还会有一些驱动,如果所有都随意安装会导致你需要卸载,或者更新软件时,有的需要将原来软件卸载干净,如果没有清晰的安装路径那真是灾难啊~请确保此目录中只有个人许可证。这样基本的配置就ok了,下面打开hightec软件检验下license是否识别到了,会让你选个工作区,建议自己建一个,要不你以后就找不到了,,,如下图拉到下面,按照要求填写信息,随便写就行,注意主要的MAC地址要填本机的物理地址,然后点击2即可。

weixin_60793044的博客 1万+

面向业务角色的 SAP Fiori Space 与 Page 创建全流程实战指南

业务角色导航设计:从Space与Page规划到实施 摘要:本文探讨了SAP S/4HANA Cloud和BTP ABAP环境中基于业务角色的导航设计方法。传统Fiori Launchpad的Group+Tile模式存在应用堆积问题,而新的Space与Page模型将导航按工作领域(如应付会计、销售代表)组织,每个Space包含多个任务导向的Page。文章详细介绍了从业务角色建模到Space/Page创建、分配的完整流程,包括核心概念解析、规划思路和具体操作步骤。重点阐述了如何根据业务需求选择创建方式(基于预交

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 185

链表基础知识详解(非常详细简单易懂)

数据结构链表详解,创建,遍历,释放,节点的查找,节点的删除,插入节点,链表排序等操作,非常详细

qq_61672347的博客 23万+

基于知识图谱的农作物病虫害问答系统设计与实现

基于规则的问题分类是自问答系统诞生以来就一直存在的方式,主要代表就是众多的专家系统,构建专家系统采用的是规则分类器,优点是能够对特定领域、特征明显的问题进行高效精准问答,但是。,在问答系统中,问题以语音及文本字符等自然语言形式输入,利用问答系统的内部的逻辑处理模块,通过自然语言处理技术获得输入问句的详细语义信息,再经过知识检索、置信分析等步骤,自然语言处理中,用于文本分类任务的机器学习方式有两种,一种用传统的机器学习,如 NBC、SVM 等,另一种采用深度学习,如 CNN 和 RNN 等。

全网粉丝30W+,优快云、稀土掘金人工智能领域签约作者,人工智能、大模型、Python 爬虫,商务合作,请私信沟通。 2166

数据结构基础之链表

链表你学会了吗?

江湖人陆仁甲 824

机器人控制算法九之 位姿描述与空间变换

机器人控制算法九之 位姿描述与空间变换

yohnyang的博客 1034

uniapp - 强力解决H5网页浏览器跨域问题,如何解决uniapp请求接口在浏览器跨域问题,UniApp H5 跨域代理配置详细教程完美解决所有uniapp跨域(调用第三方接口或服务器api跨域)

uni-app 跨域,uniApp解决h5跨域问题,解决uni-app请求接口在浏览器跨域问题,uni.request请求跨域问题解决方案,uni-app-跨域解决方法,彻底解决uniapp发布为H5的跨域问题,uniapp H5页面设置跨域请求_uniapp h5跨域配置,uniapp开发 H5 解决跨域问题,uniApp请求解决跨域问题,uniapp request如何实现前端请求跨域,解决uniapp调试过程中的请求跨域和环境配置,Uniapp调用外部api接口跨域请求,uni-app发布H5页面跨域

🏆 前端领域优质创作者 5354

C语言数据结构之链表

从某个节点前面插入新节点比从后面插入要多进行一次判断,判断是否为头节点,另一个要注意的地方就是while里的判断条件是用p->next来判断的,这是因为我们可以通过p来找到p的后一个,但是找不到p的前一个,所以这里我们灵活变换一下,代码实现逻辑和从后面插入大同小异。删除一个节点实现逻辑也很好理解,肯定也是要不断遍历,找到对应节点后把原本指向它的结构体指针指向它的下一个,然后按道理我们要把它free掉,上面的代码就是实现尾插法创建链表,这种方式创建出链表中节点的顺序也就是我们正常所认为的顺序,最先的就是头。

qq_53918454的博客 5770

ABAP Channels 之 WebSocket 通信实践:用 ABAP Push Channel 打造实时应用

摘要:本文介绍了ABAP Push Channel(APC)技术,它通过WebSocket协议实现ABAP系统与外部客户端的实时双向通信。文章对比了传统HTTP轮询与WebSocket的差异,解释了APC的事件模型及其接口演进(从IF_APC_WS_EXTENSION到IF_APC_WSP_EXTENSION)。通过仓库拣货等实际案例,展示了APC在企业级应用中的价值,如实时监控、协作场景等。文中还详细阐述了ABAP引擎中WebSocket的交互模型,说明其资源优化设计原理,并提供了基础代码示例。该技术解决

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 296

数据结构基础:数组与链表详解

本文详细介绍了数组和链表的基本概念、操作及其应用场景,并通过C语言代码示例帮助初学者理解。我们还深入探讨了复杂链表,如循环链表和双向链表。掌握这些基础知识后,你可以进一步学习更高级的数据结构,如栈、队列、树和图等。希望这篇文章能帮助你入门数据结构,并为你的学习之旅打下坚实的基础。

qq_63520660的博客 1106

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

基础数据结构:链表

基础数据结构:链表 维基百科 链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针(Pointer)。由于不必须按顺序存储,链表在插入的时候可以达到O(1)的复杂度,比另一种线性表顺序表快得多,但是查找一个节点或者访问特定编号的节点则需要O(n)的时间,而顺序表相应的时间复杂度分别是O(logn)和O(1)。 使用链表结构可以克服数组链表需要预先知道数据大小的缺点,链表结构可以充分利用计算机内存空间,实现灵活的内存动态管

qq_41857875的博客 327

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

数据结构基础篇之链表

数据结构基础篇之链表

2301_76874968的博客 927

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

3.基础数据结构-链表

链表

weixin_67852890的博客 490

数据结构:数据结构基础与链表

单向链表节点通常包含数据域和指针域/* 链表存放数据的类型 *//* 链表节点类型 */// 存放数据的空间// 存放下一个节点的地址} linknode;//struct node 是结构体名称 是类型//linknode 等价于上方 是类型(link-链 node-节点)这种结构设计使得每个节点既可以存储数据,又能指向链表中的下一个节点。

m0_74911141的博客 805

数据结构基础:链表专题

链表是数据结构中最基础也是最重要的线性表之一,它克服了数组固定大小的缺点,能够动态地进行内存分配。本文将全面介绍链表的概念、基本操作以及实际应用,帮助C语言初学者掌握这一重要数据结构。一、链表基础概念链表是⼀种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表的结构跟⽕⻋⻋厢相似,淡季时⻋次的⻋厢会相应减少,旺季时⻋次的⻋厢会额外增加几节。如果将⽕⻋⾥的某节⻋厢去掉/加上,其他⻋厢也不会受到影响,因为每节⻋厢都是独⽴存在的,且每节⻋厢都有⻋⻔。

htw250056的博客 1063

Acwing 基础课—数据结构—单链表、双链表(数组模拟)

单链表,后续邻接表的基础——常用来存储树和图 此处使用数组模拟单链表,结构体方法在 new Struct 时非常费时。 使用e[N]存储元素,ne[N]存储next值。两者通过坐标关联。 单链表如下所示 1 单链表 题目链接 https://www.acwing.com/problem/content/description/828/ 题目大意 实现一个单链表,链表初始为空,支持三种操作: (1) 向链表头插入一个数; (2) 删除第k个插入的数后面的数; (3) 在第k个插入的数后插入一个数 现在要对该

ForTres的博客 1106

C语言实现基础数据结构——链表

链表是线性表中的其中一种结构,链表在物理存储结构上是非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。在链表中,每一个存储空间都是独立申请的(需要添加数据时申请),也被称为节点(结点)在双向链表中,存在头结点,即默认有一个节点,但是该节点中不存储有效数据,只存储指向上一个节点和下一个节点的地址。在双向链表中,空链表的含义是除了头结点以外没有其他任何节点(即没有存储有效数据的节点)基于链表实现顺序表学习到的通讯录项目。在双向链表中,头结点是不可以删除的。链表实现时需要熟悉的三个。

小何代码咖啡馆 1728

C++基础语法:链表和数据结构

"打牢基础,万事不愁" .C++的基础语法的学习。

jllws1的博客 938

数据结构——链表基础

#pragma once typedef int DataType; #include&lt;stdio.h&gt; typedef struct Node//不带头结点的单链表 { struct Node* _pNext; DataType _data; }Node,*PNode; #include&lt;stdio.h&gt; #include&lt;assert.h&gt; ...

xiaoxiaoyu 234

数据结构基础知识一——链表

链表 1.逻辑上有前后顺序 2.不保证逻辑前后顺序元素挨着 以下介绍几个最基础的链表操作: 首先定义Node类: class Node{ public int value; public Node next; public Node(int value){ this.value = value; this.next = null; } } 一、插入 链表的遍历 public...

Moo_Lavender的博客 304

算法——数据结构基础(数组、队列、栈、链表、散链表)

算法——数据结构基础数组:顺序存储链表:随机存储栈:队列:散列表(哈希表):hash table1. 哈希函数2.散列表的读写操作:(1) 写操作:put(2) 读操作:get(3) 扩容:resize 文章结构概览 数组:顺序存储 读操作多,写操作少 1.读取(查找)元素:读取对应的下标 高效的查找元素的算法:二分查找 2.更新元素:对元素进行重新赋值 3.插入元素:尾部插入、中间插入、超范围插入 扩容问题,时间复杂度:O(n) 插入并移动元素,时间复杂度:O(n) 4.删除元素:1) 删除对应位置,

your_棒棒糖的博客 592

数据结构基础——链表的基本操作

1.链表的简介: 链表属于线性表数据结构中的一种,线性表分为顺序表和链表,顺序表可以理解为数组。 按正常方式定义一个数组时,计算机会从内存取出一块连续的地址来存放给定长度的数组;而链表则是由若干个结点所组成,(每个结点代表一个元素),且结点在内存中的存储位置通常是不连续的。 那么链表比数组方便在哪里呢? 比如我们要在一个序列中添加某一个元素,这时候使用数组就比较麻烦了,他需要将需要插入的位置后面的...

ly's Blog 798
上一篇: C语言基础编程题(约瑟夫环:隔二删除)
下一篇: ubuntu终端下常用快捷键操作
Otis_L
博客等级 码龄12年 191粉丝 53原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值