C#数据结构-双向链表
链表的概念以及链表与数组的差异不做过多的叙述,相信大家都耳熟能详,这里以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#数据结构-双向链表的更多相关文章
- (js描述的)数据结构[双向链表](5)
(js描述的)数据结构[双向链表](5) 一.单向链表的缺点 1.只能按顺序查找,即从上一个到下一个,不能反过来. 二.双向链表的优点 1.可以双向查找 三.双向链表的缺点 1.结构较单向链表复杂. ...
- Linux内核分析--内核中的数据结构双向链表【转】
本文转自:http://blog.csdn.net/yusiguyuan/article/details/19840065 一.首先介绍内核中链表 内核中定义的链表是双向链表,在上篇文章--libev ...
- Python数据结构--双向链表
''' 双向链表包含第一个和最后一个的链接元素. 每个链接都有一个数据字段和两个称为next和prev的链接字段. 每个链接都使用其下一个链接与其下一个链接链接. 每个链接都使用其上一个链接与之前的链 ...
- 数据结构-双向链表(Python实现)
数据结构在编程世界中一直是非常重要的一环,不管是开发还是算法,哪怕是单纯为了面试,数据结构都是必修课,今天我们介绍链表中的一种--双向链表的代码实现. 好了,话不多说直接上代码. 双向链表 首先,我们 ...
- 学习Redis你必须了解的数据结构——双向链表(JavaScript实现)
本文版权归博客园和作者吴双本人共同所有,转载和爬虫请注明原文链接 http://www.cnblogs.com/tdws/ 下午分享了JavaScript实现单向链表,晚上就来补充下双向链表吧.对链表 ...
- Java数据结构——双向链表
//================================================= // File Name : DoublyLinked_demo //------------- ...
- C实现通用数据结构--双向链表
双向链表概述 双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继next和直接前驱prev.所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结 ...
- C语言数据结构----双向链表
概括:主要说明双向链表的基本概念和具体操作以及源代码. 一.基本概念 1.有了单链表以后我们可以把内存中小块的空间联系在一起,并且把每一个小块都存储上我们想要存储的数值.但是单链表只有一个next,我 ...
- Linux内核分析--内核中的数据结构双向链表续【转】
在解释完内核中的链表基本知识以后,下面解释链表的重要接口操作: 1. 声明和初始化 实际上Linux只定义了链表节点,并没有专门定义链表头,那么一个链表结构是如何建立起来的呢?让我们来看看LIST_H ...
- Linux C 数据结构->双向链表(阴阳在六,何以言九~)
0. 弄完了单链表,在看双向链表.怎么整?多写,多想,想不通画出来在想,再写,再模仿~ 1. 没啥说的,敲代码~ 说点啥呢,注意自己的代码风格哦,要符合"潮流",不要独树一帜 ...
随机推荐
- python小白入门基础(三:整型)
# Number(int float str complex) #int 整型(正整数 0 负整数)intvar_1 = 100print(intvar_1)invar_2 = 0 print(inv ...
- 【web系统UI自动化】关于UI自动化的总结
实施过了web系统的UI自动化,回顾梳理下,想到什么写什么,随时补充. 首先,自动化测试不是手动测试的替代品,是比较好的补充,而且不是占大比重的补充. 70%的测试工作集中在底层接口测试和单元测试,2 ...
- 在GitLab pages上快速搭建Jekyll博客
前一段时间将我的Jekyll静态博客从github pages镜像部署到了 zeit.co(现vercel)上了一份,最近偶然发现gitlab pages也不错,百度也会正常抓取,于是动手倒腾,将gi ...
- Oracle12C创建scott账户
Oracle12C创建scott账户 具体步骤: 打开SqlPlus 输入用户名和密码用户名:sys口令:sys as sysdba 创建c##scott用户CREATE USER c##scott ...
- 返回boolean的mybatis查询
注意:返回数量为0时函数返回值为false,返回数量为非零值时为true. Java函数: boolean hasSameServiceCode(@Param("oldDepotCd&quo ...
- [Oracle/sql]查看当前用户名下有多少表 以及查看表字段信息
SQL> select table_name from user_tables order by table_name; TABLE_NAME ------------------------- ...
- 第一课、python基础学习笔记
自动化非自动化的区别 自动化测试就是让机器按照人的想法把功能全部跑一遍 自动化测试的过程,让我们写一段程序去测试另一段程序是否正常的过程 Java 编译型语言, 编码-->编译-->解 ...
- 安装python3,配置pycharm
1.下载最新版python3 首先去python官网下载python3的源码包,网址:https://www.python.org/ 进去之后点击导航栏的Downloads,也可以鼠标放到Downlo ...
- Python实现加密压缩成RAR或ZIP文件
博主在前两篇博文分别介绍了加密RAR文件的解压https://www.cnblogs.com/kangbazi666/p/13646308.html和加密ZIP文件的解压https://www.cnb ...
- Ajax每隔2秒自动请求服务端刷新页面
1. window.onload = function () {automatic(); } 2. function automatic(){ //每隔两秒刷新一次页面setTimeout(autom ...