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. 没啥说的,敲代码~ 说点啥呢,注意自己的代码风格哦,要符合"潮流",不要独树一帜 ...
随机推荐
- Mongos WoW
http://blog.csdn.net/yuleslie/article/details/7430094 https://github.com/mangostwo/ https://www.getm ...
- python小白入门基础(三:整型)
# Number(int float str complex) #int 整型(正整数 0 负整数)intvar_1 = 100print(intvar_1)invar_2 = 0 print(inv ...
- Windows下安装nvm管理多个nodejs版本
平常在工作中难免会有node版本的要求,下面介绍一种利用nvm工具管理多个node版本的方法 下载安装 Github: Download nvm-windows --- nvm-setup.zip 程 ...
- 小程序开发-使用npm包
微信小程序引用npm包 微信小程序官方支持使用npm包,地址为 https://developers.weixin.qq.com/miniprogram/dev/devtools/npm.html 实 ...
- 跟着兄弟连系统学习Linux-【day06】
day06-20200603 p21.用户管理命令 [useradd 用户名]添加用户 [passwd 用户名] 设置密码
- leetcode刷题-60第k个队列
题目 给出集合 [1,2,3,…,n],其所有元素共有 n! 种排列. 按大小顺序列出所有排列情况,并一一标记,当 n = 3 时, 所有排列如下: "123""132& ...
- Linux远程ssh执行命令expect使用及几种方法
expect命令实现脚本免交互 一.Linux下SSH无密码认证远程执行命令 在客户端使用ssh-keygen生成密钥对,然后把公钥复制到服务端(authorized_keys). 实现步骤: 1.客 ...
- 使用fiddler和安卓模拟器抓取安卓客户端数据包
安卓模拟器要选可以桥接网络的,本文中用的是雷电模拟器. 软件的安装都很简单,在此不再赘述. fiddler中的设置 首先,打开fiddler,点击Tools选项卡下的Options. 切换到https ...
- Java简介以及入门
JAVA基础知识 Java简介 作者:詹姆斯·高斯林(James Gosling) Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承.指针等概念,因此J ...
- ctfhub 报错注入
payload 1 Union select count(*),concat((查询语句),0x26,floor(rand(0)*2))x from information_schema.colu ...