双向-->带头-->循环链表

目录

一、双向带头循环链表概述

1.什么是双向带头循环链表

2.双向带头循环链表的优势

3.双向带头循环链表简图

二、双向带头循环链表的增删查改图解及代码实现

1.双向带头循环链表的头插

2.双向带头循环链表的尾插

3.双向带头循环链表的头删

4.双向带头循环链表的尾删

5.双向带头循环链表在pos位置前插入节点

6.双向带头循环链表删除pos位置节点


一、双向带头循环链表概述

1.什么是双向带头循环链表

        双向:每个节点都带有一个指向下一个节点的指针(next)和一个直向前一个节点的指针(prev);

        带头:即链表带有哨兵位头节点,该节点只包含两个指针,不存储有效数据;

        循环:哨兵位头节点有一个next指针指向第一个有效数据节点,还有一个prev指针指向哨兵位节点的前一个节点即链表的尾节点,因此实现了链表的循环;

        双向带头循环链表的节点类型:

typedef int LTDataType;
typedef struct ListNode
{LTDataType data;struct ListNode* next;struct ListNode* prev;
}ListNode;

2.双向带头循环链表的优势

        双向带头循环链表不需要我们遍历每个节点来找尾节点,对于链表的尾插而言就变得非常简单。由于较单向非循环链表而言,双向带头循环链表多了一个指向前一个节点的指针prev,所以在结构上较为复杂,但实际应用中少了很多的麻烦。

3.双向带头循环链表简图

 

二、双向带头循环链表的增删查改图解及代码实现

1.双向带头循环链表的头插

示意图:

代码实现:

// 双向链表头插
void ListPushFront(ListNode* pHead, LTDataType x)
{assert(pHead);ListNode* NewNode = Node_New(x);ListNode* First = pHead->next;NewNode->next = First;First->prev = NewNode;NewNode->prev = pHead;pHead->next = NewNode;
}

2.双向带头循环链表的尾插

示意图:

代码实现:

// 双向链表尾插
void ListPushBack(ListNode* pHead, LTDataType x)
{assert(pHead);ListNode* NewNode = Node_New(x);ListNode* Tail = pHead->prev;NewNode->prev = Tail;Tail->next = NewNode;NewNode->next = pHead;pHead->prev = NewNode;
}

3.双向带头循环链表的头删

示意图:

代码实现:

// 双向链表头删
void ListPopFront(ListNode* pHead)
{assert(pHead);if (pHead->next == pHead){return;}ListNode* First = pHead->next;ListNode* Next = First->next;pHead->next = Next;Next->prev = pHead;free(First);First = NULL;
}

4.双向带头循环链表的尾删

示意图:

代码实现:

// 双向链表尾删
void ListPopBack(ListNode* pHead)
{assert(pHead);if (pHead->next == pHead){return;}ListNode* Tail = pHead->prev;ListNode* Prev = Tail->prev;Prev->next = pHead;pHead->prev = Prev;free(Tail);Tail = NULL;
}

5.双向带头循环链表在pos位置前插入节点

示意图:

代码实现:

// 双向链表在pos位置的前面插入节点
void ListInsert(ListNode* pos, LTDataType x)
{ListNode* NewNode = Node_New(x);ListNode* Prev = pos->prev;Prev->next = NewNode;NewNode->prev = Prev;NewNode->next = pos;pos->prev = NewNode;
}

6.双向带头循环链表删除pos位置节点

示意图:

代码实现:

// 双向链表删除pos位置的节点
void ListErase(ListNode* pos)
{ListNode* Prev = pos->prev;ListNode* Hind = pos->next;Prev->next = Hind;Hind->prev = Prev;free(pos);pos = NULL;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/81447.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

cortex-A7核IIC实验--STM32MP157AAA

实验目的:采集温湿度传感器值 一,IIC概念 1.同步串行半双工总线,主要用于链接整体电路,硬件结构简单,接口连接方便,成本较低 2.两线制,只有两根双向信号线,数据线SDA,时钟线SCL …

el-table存在固定列,如果拖动表格头宽度,造成固定列高度崩塌

对表格添加监听表头拖动方法header-dragend"headerDragend",当拖动表格头时,触发headerDragend方法,执行表格.doLayout()方法,重新进行布局table;

keepalived+lvs(DR)(四十六)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 前言 一、作用 二、调度器配置 三、web节点配置 一、作用 使用keepalived解决lvs的单点故障 高可用集群 二、调度器配置 安装keepalived yum install -y k…

23年下半年软考系统架构设计师(最新报名时间)

高级系统架构设计师,有一定的难度,值得挑战一下 23年下半年软考架构启用最新版考试大纲,而且报名时间也推迟了,考试形式也改了,由笔试改为了机考,所以今年报名一定要多关注一下!! 软…

帮助中心实践方式:及时提示反馈,引导自助解决

为了及时高效的帮助用户解决当下实际问题,很多产品都会专门设置一个独立的产品帮助中心,满足客户需要获取解决方案的需要,减轻人工客服端压力。 帮助中心实践方式 常规的帮助中心文档和用户群,解决的是用户遇到问题或者疑问时&am…

无涯教程-PHP - 性能优化

根据Zend小组的说明,以下插图显示了PHP 7与PHP 5.6和基于流行的基于PHP的应用程序上的HHVM 3.7。 Magento 1.9 与执行Magento事务的PHP 5.6相比,PHP 7的运行速度证明是其两倍。 Drupal 7 在执行Drupal事务时,与PHP 5.6相比,PHP 7的运行速度…

C++设计模式(工厂方法模式)

文章目录 前言一、工厂方法模式介绍二、工厂方法模式和简单工厂模式对比三、工厂方法模式适用场景四、工厂方法模式示例代码总结 前言 本篇文章来带大家学习C中的工厂方法模式。 一、工厂方法模式介绍 工厂方法模式是一种创建型设计模式,用于通过工厂方法创建对象…

JAVA JNA 调用C接口的三种方式

文章目录 1. 准备一个共享库文件2. JNA姿势1—继承Library接口3. JNA姿势2—直接NativeLibrary.getInstance3. JNA姿势3—Native方法 1. 准备一个共享库文件 test.c #include <stdio.h> int test(char *input){printf("input:%s\n",input);return 0; }libtes…

Pyqt5打开电脑摄像头进行拍照

目录 1、设计UI界面 2、设计逻辑代码&#xff0c;建立连接显示窗口 3、结果 1、设计UI界面 将ui界面转为py文件后获得的逻辑代码为&#xff1a;&#xff08;文件名为 Camera.py&#xff09; # -*- coding: utf-8 -*-# Form implementation generated from reading ui file …

C++,运算符重载——关系运算符练习

一、关系运算符重载 > > < < ! #include <iostream> using namespace std;class Relates { private:int a;int b; public:Relates() {}Relates(int a,int b):a(a),b(b) {}bool operator>(const Relates &R) const{if((a>R.a&&b>R.b) …

docker 安装oracle19c linux命令执行sql

docker安装oracle # 下载镜像 19.3.0.0.0 docker pull registry.cn-hangzhou.aliyuncs.com/laowu/oracle:19c # 创建文件 mkdir -p /home/mymount/oracle19c/oradata # 授权&#xff0c;不授权会导致后面安装失败 chmod 777 /home/mymount/oracle19c/oradatadocker run -d \ …

Java8 Stream流常用方法

1、Stream流思想 Stream流的三类方法 获取Stream流 创建一条流水线,并把数据放到流水线上准备进行操作 中间方法 流水线上的操作 一次操作完毕之后,还可以继续进行其他操作 终结方法 一个Stream流只能有一个终结方法 是流水线上的最后一个操作 生成Stream流的方式 Collect…