链表的概念以及链表与数组的差异不做过多的叙述,相信大家都耳熟能详,这里以c#语言实现简单的双向链表,作为备用,记录下~

    public class Node<T>
{
private Node<T> prev; private Node<T> next; private T val; public Node<T> Prev { get { return prev; } set { prev = value; } } public Node<T> Next { get { return next; } set { next = value; } } public T Data { get { return val; } set { val = value; } } public Node(T item)
{
val = item;
}
}
public class Link<T>
{
public Node<T> head { get; set; } public int count { get; set; } public Link()
{
Node<T> node = new Node<T>(default(T));
node.Next = node;
node.Prev = node;
head = node;
count++;
} public Node<T> Append(T node)
{
Node<T> newNode = new Node<T>(node);
newNode.Prev = head.Prev;
newNode.Next = head;
head.Prev.Next = newNode;
head.Prev = newNode;
count++;
return newNode;
} public Node<T> Insert(int index, T node)
{
if (index < 0 || index > count)
throw new IndexOutOfRangeException("索引超出界限");
if (index == 0)
return Append(node);
else
{
Node<T> bnode = Get(index);
Node<T> newNode = new Node<T>(node);
bnode.Prev.Next = newNode;
newNode.Prev = bnode.Prev;
newNode.Next = bnode;
bnode.Prev = newNode;
count++;
return newNode;
}
} public void Delete(int index)
{
if (index < 0 || index > count)
throw new IndexOutOfRangeException("索引超出界限");
Node<T> node = Get(index);
node.Prev.Next = node.Next;
node.Next.Prev = node.Prev;
count--;
} public void showAll()
{
for (int i = 0; i < count; i++)
{
Console.WriteLine($"index:{i},content:{Get(i).Data}");
}
} public Node<T> Get(int index)
{
if (index < 0 || index >= count)
throw new IndexOutOfRangeException("索引超出界限"); //如果要找的节点在前半部分,则顺序查找,
if (index < count / 2)
{
var node = head.Next;
for (int i = 0; i < index; i++)
node = node.Next;
return node;
}
//否则逆序查找
var preNode = head.Prev;
for (int i = 0; i < count-1-index; i++)
preNode = preNode.Prev;
return preNode;
}
/// <summary>
/// 获取最后一条
/// </summary>
/// <returns></returns>
public Node<T> GetLast()
{
return Get(count - 1);
} public Node<T> GetFirst()
{
return Get(0);
}
}

测试:

    class Program
{
static void Main(string[] args)
{
Link<string> dlink = new Link<string>();
dlink.Append("我是第一位");
dlink.Append("我是第二位");
dlink.Append("我是第三位");
dlink.Insert(2,"我是第四位,我占用了第二的位置");
dlink.Append("我是第五位");
dlink.Append("我是第六位");
dlink.Append("我是第七位");
dlink.Append("我是第八位");
dlink.Append("我是第九位");
dlink.Delete(7); dlink.showAll(); Console.ReadLine();
}
}

打印输出结果:


欢迎一起学习交流

C#数据结构-双向链表的更多相关文章

  1. (js描述的)数据结构[双向链表](5)

    (js描述的)数据结构[双向链表](5) 一.单向链表的缺点 1.只能按顺序查找,即从上一个到下一个,不能反过来. 二.双向链表的优点 1.可以双向查找 三.双向链表的缺点 1.结构较单向链表复杂. ...

  2. Linux内核分析--内核中的数据结构双向链表【转】

    本文转自:http://blog.csdn.net/yusiguyuan/article/details/19840065 一.首先介绍内核中链表 内核中定义的链表是双向链表,在上篇文章--libev ...

  3. Python数据结构--双向链表

    ''' 双向链表包含第一个和最后一个的链接元素. 每个链接都有一个数据字段和两个称为next和prev的链接字段. 每个链接都使用其下一个链接与其下一个链接链接. 每个链接都使用其上一个链接与之前的链 ...

  4. 数据结构-双向链表(Python实现)

    数据结构在编程世界中一直是非常重要的一环,不管是开发还是算法,哪怕是单纯为了面试,数据结构都是必修课,今天我们介绍链表中的一种--双向链表的代码实现. 好了,话不多说直接上代码. 双向链表 首先,我们 ...

  5. 学习Redis你必须了解的数据结构——双向链表(JavaScript实现)

    本文版权归博客园和作者吴双本人共同所有,转载和爬虫请注明原文链接 http://www.cnblogs.com/tdws/ 下午分享了JavaScript实现单向链表,晚上就来补充下双向链表吧.对链表 ...

  6. Java数据结构——双向链表

    //================================================= // File Name : DoublyLinked_demo //------------- ...

  7. C实现通用数据结构--双向链表

    双向链表概述 双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继next和直接前驱prev.所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结 ...

  8. C语言数据结构----双向链表

    概括:主要说明双向链表的基本概念和具体操作以及源代码. 一.基本概念 1.有了单链表以后我们可以把内存中小块的空间联系在一起,并且把每一个小块都存储上我们想要存储的数值.但是单链表只有一个next,我 ...

  9. Linux内核分析--内核中的数据结构双向链表续【转】

    在解释完内核中的链表基本知识以后,下面解释链表的重要接口操作: 1. 声明和初始化 实际上Linux只定义了链表节点,并没有专门定义链表头,那么一个链表结构是如何建立起来的呢?让我们来看看LIST_H ...

  10. Linux C 数据结构->双向链表(阴阳在六,何以言九~)

    0. 弄完了单链表,在看双向链表.怎么整?多写,多想,想不通画出来在想,再写,再模仿~ 1.  没啥说的,敲代码~  说点啥呢,注意自己的代码风格哦,要符合"潮流",不要独树一帜 ...

随机推荐

  1. Mono嵌入C++

    http://docs.go-mono.com/index.aspx?link=xhtml%3Adeploy%2Fmono-api-embedding.html https://www.mono-pr ...

  2. ASP导出数据到excel遇到的一些问题

    一直用动易平台的ASP做新闻发布网站,直到现在才接触导出数据到Excel的问题,目的在于公司要统计各部门的投稿量,要做这么个东西,实现起来是挺简单的,但是第一次做,还是费了一些功夫的,特此记录一下 主 ...

  3. 《神经网络的梯度推导与代码验证》之LSTM的前向传播和反向梯度推导

    前言 在本篇章,我们将专门针对LSTM这种网络结构进行前向传播介绍和反向梯度推导. 关于LSTM的梯度推导,这一块确实挺不好掌握,原因有: 一些经典的deep learning 教程,例如花书缺乏相关 ...

  4. C:把算术表达式分成Token

    代码: #include "stdafx.h" #include <stdio.h> #include <string.h> #include <st ...

  5. 关于h5游戏开发,你想了解的一切都在这儿!

    ​2020年,受疫情影响,线下产业红利褪去,线上迎来的新一轮的高峰.众多商家纷纷抓住了转型时机,开启了流量争夺战.H5游戏定制无疑是今年引流的大热门.如何开发一款有趣.有爆点.用户爱买单的好游戏呢? ...

  6. 性能测试1:loadrunner介绍及代理录制

    一.安装loadrunner lr安装环境要求: Lr11只支持ie9及一下,火狐30以下,不支持chrome.  操作系统只支持到win7.Lr打开时必须用管理员身份打开 在虚拟机中安装的win7, ...

  7. Linux:apache安装

    1.查询是否已安装 rpm -qa httpd 如果已安装,先卸载 发现有依赖包,先把依赖卸载 或者加上--nodeps参数,不考虑依赖,直接卸载   rpm -e --nodeps httpd-2. ...

  8. matlab数字图像处理-给图片加入可视水印信息

    将文件夹路径改成了我想要存放代码的文件夹下 然后也是在网上百度,找到了一个代码,敲着模仿了一个 自己建立了一个脚本文件 >>edit test1 然后在脚本中添加 %读取待嵌入水印的图像和 ...

  9. SpringBoot框架:快速入门搭建运行一个应用程序(一)

    一.环境配置 Java环境:1.8版本 开发工具:IntelliJ IDEA 二.简单应用 1.创建项目 选择创建的项目类型为Spring Initializr,Project SDK选择1.8版本的 ...

  10. 操作系统(AIX)双因素身份认证解决方案-中科恒伦CKEY DAS

      一.场景分析 操作系统是管理计算机硬件与软件资源的计算机程序,用于工作中的进程管理.存储管理.设备管理.文件管理.作业管理等,十分重要,安全等级极高! 二.问题分析 1.密码设置简单,非常容易被撞 ...