C#数据结构与算法系列(六):链表——双链表(Double-LinkedList)
1.对比单向链表
单向链表查找的方向只能是一个方向,而双向链表可以向前或者向后查找
单向链表不能自我删除,需要靠辅助节点,而双向链表可以自我删除
对于单向链表的删除,我们首先要找到单向链表待删除节点的前一个节点,然后前一个节点的下一个节点指向删除节点的后一个节点。
2.双向链表的思路

3.代码实现
public class ListNode
{
public ListNode(int id, string name, string nickName)
{
this.Id = id;
this.Name = name;
this.NickName = nickName;
}
public int Id { get; set; } public string Name { get; set; } public string NickName { get; set; } public ListNode Next { get; set; } public ListNode Pre { get; set; }
}
public class DoubleLinkedList
{
public ListNode HeadNode; public DoubleLinkedList()
{
HeadNode = new ListNode(, "", "");
} public void GetList()
{
var temp = HeadNode.Next; while (temp != null)
{
Console.WriteLine($"id={temp.Id},name={temp.Name},nickName={temp.NickName}"); temp = temp.Next;
}
} public void Add(ListNode listNode)
{
var temp = HeadNode; //如果temp.Next为null就表示temp为最后一个节点;
while (temp.Next != null)
{
temp = temp.Next;
}
//把最后的节点指向待添加的节点
temp.Next = listNode; //将待添加的前一个节点指向temp
listNode.Pre = temp;
} public void Update(ListNode listNode)
{
var temp = HeadNode; //bool flag = false; while (temp.Next != null)
{
if (temp.Next.Id == listNode.Id)
{
//flag = true;
temp.Next.Name = listNode.Name; temp.Next.NickName = listNode.NickName; break;
} temp = temp.Next;
} //if (flag)
//{
// temp.Next.Name = listNode.Name;
// temp.Next.NickName = listNode.NickName;
//}
//else Console.WriteLine("未找到");
} public void Delete(int id)
{
/*{
var temp = HeadNode; while (temp.Next != null)
{
if (temp.Next.Id == id)
{
if (temp.Next.Next != null)
temp.Next.Next.Pre = temp;
temp.Next.Pre.Next = temp.Next.Next;
}
temp = temp.Next;
}
}*/ var temp = HeadNode.Next; while (temp != null)
{
if (temp.Id == id)
{
//如果是最后一个节点,那么就不需要执行下面的temp.Next.Pre = temp.Pre;
if (temp.Next != null) temp.Next.Pre = temp.Pre;//将temp的后一个节点的前一个指针指向temp的前一个节点 temp.Pre.Next = temp.Next;//将temp的前一个节点的后一个指针指向temp的后一个节点
} temp = temp.Next;
}
} public static void Test()
{
Console.WriteLine("双向链表的测试\n"); ListNode listNode1 = new ListNode(, "宋江", "及时雨");
ListNode listNode2 = new ListNode(, "卢俊义", "玉麒麟");
ListNode listNode3 = new ListNode(, "吴用", "智多星");
ListNode listNode4 = new ListNode(, "林冲", "豹子头"); DoubleLinkedList linkedList = new DoubleLinkedList(); //添加链表数据
linkedList.Add(listNode1);
linkedList.Add(listNode2);
linkedList.Add(listNode3);
linkedList.Add(listNode4); //获取链表所有数据
linkedList.GetList(); linkedList.Update(new ListNode(, "宋", "及时")); Console.WriteLine("\n获取链表修改后的所有数据\n");
linkedList.GetList(); linkedList.Delete(); Console.WriteLine("\n获取链表删除后的所有数据\n");
linkedList.GetList();
}
}

C#数据结构与算法系列(六):链表——双链表(Double-LinkedList)的更多相关文章
- 数据结构与算法系列2 线性表 链表的分类+使用java实现链表+链表源码详解
数据结构与算法系列2.2 线性表 什么是链表? 链表是一种物理存储单元上非连续,非顺序的存储结构,数据元素的逻辑顺序是通过链表的链接次序实现的一系列节点组成,节点可以在运行时动态生成,每个节点包括两个 ...
- javascript实现数据结构与算法系列:栈 -- 顺序存储表示和链式表示及示例
栈(Stack)是限定仅在表尾进行插入或删除操作的线性表.表尾为栈顶(top),表头为栈底(bottom),不含元素的空表为空栈. 栈又称为后进先出(last in first out)的线性表. 堆 ...
- C# 数据结构 - 单链表 双链表 环形链表
链表特点(单链表 双链表) 优点:插入和删除非常快.因为单链表只需要修改Next指向的节点,双链表只需要指向Next和Prev的节点就可以完成插入和删除操作. 缺点:当需要查找某一个节点的时候就需要一 ...
- 数据结构与算法系列2 线性表 使用java实现动态数组+ArrayList源码详解
数据结构与算法系列2 线性表 使用java实现动态数组+ArrayList源码详解 对数组有不了解的可以先看看我的另一篇文章,那篇文章对数组有很多详细的解析,而本篇文章则着重讲动态数组,另一篇文章链接 ...
- 数据结构与算法之PHP实现链表类(单链表/双链表/循环链表)
链表是由一组节点组成的集合.每个节点都使用一个对象的引用指向它的后继.指向另一个节点的引用叫做链表. 链表分为单链表.双链表.循环链表. 一.单链表 插入:链表中插入一个节点的效率很高.向链表中插 ...
- 数据结构与算法系列研究七——图、prim算法、dijkstra算法
图.prim算法.dijkstra算法 1. 图的定义 图(Graph)可以简单表示为G=<V, E>,其中V称为顶点(vertex)集合,E称为边(edge)集合.图论中的图(graph ...
- 《数据结构与算法之美》 <05>链表(下):如何轻松写出正确的链表代码?
想要写好链表代码并不是容易的事儿,尤其是那些复杂的链表操作,比如链表反转.有序链表合并等,写的时候非常容易出错.从我上百场面试的经验来看,能把“链表反转”这几行代码写对的人不足 10%. 为什么链表代 ...
- javascript实现数据结构与算法系列:循环链表与双向链表
循环链表(circular linked list) 是另一种形式的链式存储结构.它的特点是表中最后一个结点的指针域指向头结点,整个表形成一个环. 循环链表的操作和线性链表基本一致,仅有细微差别. w ...
- 数据结构与算法系列研究五——树、二叉树、三叉树、平衡排序二叉树AVL
树.二叉树.三叉树.平衡排序二叉树AVL 一.树的定义 树是计算机算法最重要的非线性结构.树中每个数据元素至多有一个直接前驱,但可以有多个直接后继.树是一种以分支关系定义的层次结构. a.树是n ...
随机推荐
- Maven、Gradle 配置国内镜像源
Maven 全局配置 修改 Maven 默认的全局配置文件: 类 Unix 系统: Mac OS / Linux 默认在 ~/.m2/settings.xml Windows 系统:一般在 Maven ...
- Java——连接MySql数据库
eclipse项目文件结构 /JavaConnMySqlTest/src/db.properties jdbc.drivers=com.mysql.jdbc.Driver jdbc.url=jdbc: ...
- step over、step into、step into my code、step out、run to cursor
红 step over 跳过子函数 黄 step into 进入子函数 蓝 step into my code 不执行源码的子函数执行自己的 黑 step out 跳出当前函数 绿 run to cu ...
- Html响应式图片
Html响应式图片 1.介绍:根据屏幕匹配的不同尺寸显示不同图片,picture 元素允许我们在不同的设备上显示不同的图片,一般用于响应式 <!-- 在不同的屏幕尺度下显示不同的图片 --> ...
- 0506static【重点】
static[重点] [重点] 1.[没有对象] [没有对象] [没有对象] 2.static 修饰的是一个资源共享类型的变量 3.静态成员变量的基本使用规范 static修饰的成员变量只能通过静态方 ...
- 二刷Redux笔记
关于react的一些思考 所有的数据全部先要发送给容器,然后容器负责接受数据单后再分发数据给他下面的组件,通过props来传递,一个页面就可以相当于一个容器,容器之中就会有很多子组件,一般组件只负责接 ...
- Istio 流量劫持过程
开篇 Istio 流量劫持的文章其实目前可以在servicemesher社区找到一篇非常详细的文章,可查阅:Istio 中的 Sidecar 注入及透明流量劫持过程详解.特别是博主整理的那张" ...
- [Wireshark]_002_玩转数据包
通过前一篇文章,我们大概了解了Wireshark,现在可以准备好进行数据包的捕获和分析了.这一片我们将讲到如何使用捕获文件,分析数据包以及时间格式显示等. 1.使用捕获文件 进行数据包分析时,其实很大 ...
- Java IO(十六)InputStreamReader 和 InputStreamWriter
Java IO(十六)InputStreamReader 和 InputStreamWriter 一.介绍 InputStreamReader 和 OutputStreamWriter 是字节流通向字 ...
- PHP AES加解密(兼容php5,php7)
最近在工作中负责对接API,对方要求对业务数据进行AES 算法(256,ECB,补码方式:PKCS5Padding)加密. 加密算法要求如下: 算法AES/ECB/PKCS5Padding 密钥长度2 ...