链表的概念以及链表与数组的差异不做过多的叙述,相信大家都耳熟能详,这里以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. 3D人物移动控制实现方案

    要控制3D人物在3D世界中进行正常的移动.转向,一般有两种情况: 1.使用人物动画控制人物 的移动 转向 2.使用脚本控制人物 的移动.转向 对方案一: Animator 组件勾选上 Apply Ro ...

  2. Python基本

    Python基本规则 1.面向对象的跨平台的编程语言 2.文件类型是.py, 3.一个文件是一个模块module,运行整个文件 4.不支持非英文字符,区分大小写 5.一行是一条语句,多条语句写一行用; ...

  3. HDU - 1261-字串数 (排列组合+大数)

    一个A和两个B一共可以组成三种字符串:"ABB","BAB","BBA". 给定若干字母和它们相应的个数,计算一共可以组成多少个不同的字符串 ...

  4. Java8 ParallelStream

    ParallelStream 并行流就是一个把内容拆分成多个数据块,用不同线程分别处理每个数据块的流.对收集源调用parallelStream方法就能将集合转换为并行流. 并行流 并行流和顺序流转换 ...

  5. 08_线程间通信 ITC

    1.线程间的通信方式 1.共享全局变量 2.线程队列(queue) 3.信号量(Semaphore) 2.共享全局变量进行通信 from threading import Thread import ...

  6. MySql数据库规范与原则

    1.数据库表名命名规范 采用26个英文字母(区分大小写)和0-9的自然数(经常不需要)加上下划线'_'组成; 命名简洁明确,多个单词用下划线'_'分隔; 例如:user_login, user_pro ...

  7. C009:产品格式化输出

    代码: #include "stdafx.h" int _tmain(int argc, _TCHAR* argv[]) { int itemNum; float unitPric ...

  8. archaius(4) 属性对象

    讲完上一节,我们就可以使用合理的配置管理器或者实现自己的配置管理来管理我们的配置项了.archaius还提供了一种新的配置使用的方式. 动态属性对象 动态属性对象针对每个配置项以对象方式进行操作,并且 ...

  9. 虚拟机Ubuntu(18.04.2)下安装配置Hadoop(2.9.2)(伪分布式+Java8)

    [本文结构] [1]安装Hadoop前的准备工作 [1.1] 创建新用户 [1.2] 更新APT [1.3] 安装SSH [1.4] 安装Java环境 [2]安装和配置hadoop [2.1] Had ...

  10. Win10环境下Hadoop(单节点伪分布式)的安装与配置--bug(yarn的8088端口打不开+)

    一.本文思路 [1].配置java环境–JDK12(Hadoop的底层实现语言是java,hadoop运行需要JDK环境) [2].安装Hadoop 1.解压hadop 2.配置hadoop环境变量 ...