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)的更多相关文章

  1. 数据结构与算法系列2 线性表 链表的分类+使用java实现链表+链表源码详解

    数据结构与算法系列2.2 线性表 什么是链表? 链表是一种物理存储单元上非连续,非顺序的存储结构,数据元素的逻辑顺序是通过链表的链接次序实现的一系列节点组成,节点可以在运行时动态生成,每个节点包括两个 ...

  2. javascript实现数据结构与算法系列:栈 -- 顺序存储表示和链式表示及示例

    栈(Stack)是限定仅在表尾进行插入或删除操作的线性表.表尾为栈顶(top),表头为栈底(bottom),不含元素的空表为空栈. 栈又称为后进先出(last in first out)的线性表. 堆 ...

  3. C# 数据结构 - 单链表 双链表 环形链表

    链表特点(单链表 双链表) 优点:插入和删除非常快.因为单链表只需要修改Next指向的节点,双链表只需要指向Next和Prev的节点就可以完成插入和删除操作. 缺点:当需要查找某一个节点的时候就需要一 ...

  4. 数据结构与算法系列2 线性表 使用java实现动态数组+ArrayList源码详解

    数据结构与算法系列2 线性表 使用java实现动态数组+ArrayList源码详解 对数组有不了解的可以先看看我的另一篇文章,那篇文章对数组有很多详细的解析,而本篇文章则着重讲动态数组,另一篇文章链接 ...

  5. 数据结构与算法之PHP实现链表类(单链表/双链表/循环链表)

    链表是由一组节点组成的集合.每个节点都使用一个对象的引用指向它的后继.指向另一个节点的引用叫做链表. 链表分为单链表.双链表.循环链表.   一.单链表 插入:链表中插入一个节点的效率很高.向链表中插 ...

  6. 数据结构与算法系列研究七——图、prim算法、dijkstra算法

    图.prim算法.dijkstra算法 1. 图的定义 图(Graph)可以简单表示为G=<V, E>,其中V称为顶点(vertex)集合,E称为边(edge)集合.图论中的图(graph ...

  7. 《数据结构与算法之美》 <05>链表(下):如何轻松写出正确的链表代码?

    想要写好链表代码并不是容易的事儿,尤其是那些复杂的链表操作,比如链表反转.有序链表合并等,写的时候非常容易出错.从我上百场面试的经验来看,能把“链表反转”这几行代码写对的人不足 10%. 为什么链表代 ...

  8. javascript实现数据结构与算法系列:循环链表与双向链表

    循环链表(circular linked list) 是另一种形式的链式存储结构.它的特点是表中最后一个结点的指针域指向头结点,整个表形成一个环. 循环链表的操作和线性链表基本一致,仅有细微差别. w ...

  9. 数据结构与算法系列研究五——树、二叉树、三叉树、平衡排序二叉树AVL

    树.二叉树.三叉树.平衡排序二叉树AVL 一.树的定义 树是计算机算法最重要的非线性结构.树中每个数据元素至多有一个直接前驱,但可以有多个直接后继.树是一种以分支关系定义的层次结构.    a.树是n ...

随机推荐

  1. docker启动各种容器命令大全

    安装步骤梳理 搜索镜像 拉取镜像 查看镜像 启动镜像 停止容器 移除容器 安装tomcat docker hub好查找tomcat镜像  docker search tomcat 从docker hu ...

  2. MySQL复制表结构以及复制表等等

    mysql中用命令行复制表结构的方法主要有一下几种: 1.只复制表结构到新表 1 CREATE TABLE 新表 SELECT * FROM 旧表 WHERE 1=2; 或 1 CREATE TABL ...

  3. pip命令报错“no perl script found in input”

    windows10,命令行下使用pip命令时报错,python运行成功,且环境变量已经设置,可能是更新了新版本pip所导致 解决方案: 一.使用pip.exe+命令可解决这个问题 二.进行python ...

  4. Mysql的一次查询的过程

    1.用户发起请求,这里往往时多线程并发访问 2.去数据库线程池拿数据库链接,如果没有线程池,每次访问都要和数据库建立一次连接,非常耗时,效率低下 3.数据库层面上来说,可能会有多个系统同时访问它,所以 ...

  5. spring cloud系列教程第六篇-Eureka集群版

    spring cloud系列教程第六篇-Eureka集群版 本文主要内容: 本文来源:本文由凯哥Java(kaigejava)发布在博客园博客的.转载请注明 1:Eureka执行步骤理解 2:集群原理 ...

  6. git简单的使用步骤

    Git介绍 Git是分布式版本控制系统 集中式VS分布式,SVN VS Git 1)SVN和Git主要的区别在于历史版本维护的位置 2)这两个工具主要的区别在于历史版本维护的位置Git本地仓库包含代码 ...

  7. css:选择器(标签、类、ID、通配符)

    1.css概述 主要的使用场景就是美化网页,布局页面 (1)html的局限性 它只关注内容的语义,只能做一些简单的样式,并且非常的臃肿和繁琐 (2)css对网页美化的作用 css是层叠样式表的简称,它 ...

  8. 题解 P4071 【[SDOI2016]排列计数】 (费马小定理求组合数 + 错排问题)

    luogu题目传送门! luogu博客通道! 这题要用到错排,先理解一下什么是错排: 问题:有一个数集A,里面有n个元素 a[i].求,如果将其打乱,有多少种方法使得所有第原来的i个数a[i]不在原来 ...

  9. HttpSession之简易购物车

    创建一个简单的购物车模型,由三个 jsp 和两个 Servlet 组成: step1.jsp <%@ page language="java" contentType=&qu ...

  10. 深入浅出Spring MVC

    摘要 本文旨在详细分析SpringMVC工作原理以及作为开发者如何基于SpringMVC做扩展.因为SpringMVC分析的文章比较多,所以本文重点讲解如何利用SpringMVC的扩展点实现我们的需求 ...