C#数据结构与算法系列(四):链表——单链表(Single-LinkedList)
1.介绍:
链表是有序的列表,但是它在内存的存储如下:

链表是以节点的方式来存储,链式存储
每一个节点包含data域,next域:指向下一个节点
链表的各个节点不一定是连续存储
链表分带头节点的链表和不带头节点的链表,根据实际的需求来确定
单链表(带头节点)

2.应用实例
使用带head头的单向链表实现 –水浒英雄排行榜管理完成对英雄人物的增删改查操作
第一种方法在添加英雄时,直接添加到链表的尾部
第二种方式在添加英雄时,根据排名将英雄插入到指定位置
(如果有这个排名,则添加失败,并给出提示)
第一种方式思路

第二种思路

删除思路

代码:
public class HeroNode
{
public HeroNode(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 HeroNode Next { get; set; } public override string ToString()
{
return base.ToString();
}
}
public class SingleLinkedList
{ private HeroNode head = null; public SingleLinkedList()
{
//初始化头节点,头节点不要动,不存放具体的数据
head = new HeroNode(, "", "");
}
/// <summary>
/// 添加节点
/// </summary>
/// <param name="heroNode"></param>
public void Add(HeroNode heroNode)
{
//因为head节点不能动,因此我们需要一个辅助遍历temp
var temp = head; while (true)
{
//找到链表的最后
if (temp.Next == null) break; temp = temp.Next;
}
//当退出while循环时,temp就指向了链表的最后
//将最后的这个节点的next指向新的节点
temp.Next = heroNode;
}
/// <summary>
/// 按Id顺序添加节点
/// </summary>
/// <param name="heroNode"></param>
public void AddById(HeroNode heroNode)
{
//因为头节点不能动,因此我们仍然通过一个辅助指针(变量)来帮助找到添加的位置
//因为是单链表,我们找的temp是位于添加位置的前一个节点,否则插入不了
var temp = head;
//定义一个flag,标志添加的Id是否存在,默认为false
bool flag = false;
while (true)
{
//说明temp已经在链表的最后
if (temp.Next == null) break;
//位置找到,就在temp的后面插入
if (temp.Next.Id > heroNode.Id) break;
//说明希望存入的节点已存在
if (temp.Next.Id == heroNode.Id)
{
//说明Id已经存在
flag = true;
break;
}
//后移,遍历当前链表
temp = temp.Next;
}
//说明Id已经存在
if (flag) Console.WriteLine($"{heroNode.Id}节点已存在");
else
{
//把原本存在的节点,存入新的节点后面
heroNode.Next = temp.Next;
//把新的节点插入到链表中,temp后面
temp.Next = heroNode;
}
} /// <summary>
/// 更新节点
/// </summary>
/// <param name="heroNode"></param>
public void Update(HeroNode heroNode)
{
var temp = head.Next;
bool flag = false;
//if (temp == null) Console.WriteLine("链表为空");
//else
//{
while (true)
{
if (temp == null) break; //找到节点
if (temp.Id==heroNode.Id)
{
flag = true;
break;
}
temp = temp.Next;
} if (flag)
{
temp.Name = heroNode.Name;
temp.NickName = heroNode.NickName;
}
else Console.WriteLine($"没有找到Id:{heroNode.Id}的节点");
//}
} /// <summary>
/// 删除节点
/// </summary>
/// <param name="id"></param>
public void Delete(int id)
{
var temp = head; bool flag = false; while (true)
{
if (temp.Next == null) break; //已经到了链表的最后 //找到待删除节点的前一个节点
if(temp.Next.Id==id)
{
flag = true;
break;
}
temp = temp.Next;
} //将待删除的前一个节点前指向待删除的后一个节点
if (flag) temp.Next = temp.Next.Next; else Console.WriteLine("未找到节点");
} public void GetList()
{
var temp = head.Next;
//if (temp == null) Console.WriteLine("链表为空");
//else
//{
while (true)
{
if (temp == null) break; Console.WriteLine($"id={temp.Id},name={temp.Name},nickName={temp.NickName}"); temp = temp.Next;
}
//}
} public static void Test()
{
HeroNode heroNode1 = new HeroNode(, "宋江", "及时雨");
HeroNode heroNode2 = new HeroNode(, "卢俊义", "玉麒麟");
HeroNode heroNode3 = new HeroNode(, "吴用", "智多星");
HeroNode heroNode4 = new HeroNode(, "林冲", "豹子头"); SingleLinkedList singleLinkedList = new SingleLinkedList(); //singleLinkedList.Add(heroNode1);
//singleLinkedList.Add(heroNode2);
//singleLinkedList.Add(heroNode3);
//singleLinkedList.Add(heroNode4); singleLinkedList.AddById(heroNode1);
singleLinkedList.AddById(heroNode4);
singleLinkedList.AddById(heroNode3);
singleLinkedList.AddById(heroNode2); singleLinkedList.Delete(); singleLinkedList.Update(new HeroNode(, "李逵", "黑旋风")); singleLinkedList.GetList();
}
}
C#数据结构与算法系列(四):链表——单链表(Single-LinkedList)的更多相关文章
- 数据结构与算法系列2 线性表 链表的分类+使用java实现链表+链表源码详解
数据结构与算法系列2.2 线性表 什么是链表? 链表是一种物理存储单元上非连续,非顺序的存储结构,数据元素的逻辑顺序是通过链表的链接次序实现的一系列节点组成,节点可以在运行时动态生成,每个节点包括两个 ...
- [PTA] 数据结构与算法题目集 6-1 单链表逆转
List Reverse(List L) { List p, q; p = L; q = L; L = NULL; while (p) { p = p->Next; q->Next = L ...
- javascript实现数据结构与算法系列:栈 -- 顺序存储表示和链式表示及示例
栈(Stack)是限定仅在表尾进行插入或删除操作的线性表.表尾为栈顶(top),表头为栈底(bottom),不含元素的空表为空栈. 栈又称为后进先出(last in first out)的线性表. 堆 ...
- 数据结构与算法系列2 线性表 使用java实现动态数组+ArrayList源码详解
数据结构与算法系列2 线性表 使用java实现动态数组+ArrayList源码详解 对数组有不了解的可以先看看我的另一篇文章,那篇文章对数组有很多详细的解析,而本篇文章则着重讲动态数组,另一篇文章链接 ...
- javascript实现数据结构与算法系列:线性表的静态单链表存储结构
有时可借用一维数组来描述线性链表,这就是线性表的静态单链表存储结构. 在静态链表中,数组的一个分量表示一个结点,同时用游标(cur)代替指针指示结点在数组中的相对位置.数组的第0分量可看成头结点,其指 ...
- C#数据结构与算法系列(五):常见单链表笔试
1.求单链表中有效节点个数 public static int GetLength(HeroNode headNode) { int length = ; var cur = headNode.Nex ...
- C#数据结构与算法系列(六):链表——双链表(Double-LinkedList)
1.对比单向链表 单向链表查找的方向只能是一个方向,而双向链表可以向前或者向后查找 单向链表不能自我删除,需要靠辅助节点,而双向链表可以自我删除 对于单向链表的删除,我们首先要找到单向链表待删除节点的 ...
- 数据结构与算法系列研究七——图、prim算法、dijkstra算法
图.prim算法.dijkstra算法 1. 图的定义 图(Graph)可以简单表示为G=<V, E>,其中V称为顶点(vertex)集合,E称为边(edge)集合.图论中的图(graph ...
- 《数据结构与算法之美》 <05>链表(下):如何轻松写出正确的链表代码?
想要写好链表代码并不是容易的事儿,尤其是那些复杂的链表操作,比如链表反转.有序链表合并等,写的时候非常容易出错.从我上百场面试的经验来看,能把“链表反转”这几行代码写对的人不足 10%. 为什么链表代 ...
随机推荐
- search(16)- elastic4s-内嵌文件:nested and join
从SQL领域来的用户,对于ES的文件关系维护方式会感到很不习惯.毕竟,ES是分布式数据库只能高效处理独个扁平类型文件,无法支持关系式数据库那样的文件拼接.但是,任何数据库应用都无法避免树型文件关系,因 ...
- LaunchScreen作为启动图设置,修改无效的解决方案
原有的推流APP用launchScreen做的启动图,现在要修改一张,发现修改无效. 当前测试的方法有 1,重启Xcode 卸载app 清楚xcode缓存 2,修改launchScreen.stor ...
- 程序员都在用的 IDEA 插件(不断更新)
IDEA一些不错的插件分享 目录 IDEA一些不错的插件分享 插件集合 CamelCase Translation LiveEdit MarkDown Navigator Jrebel CheckSt ...
- SQL——TOP、IN、BETWEEN AND、IS NULL和IS NOT NULL
TOP子句 - 用于规定要返回的记录的数目.并不是所有数据库都支持TOP子句. 语法: SQLServer:SELECT TOP number|percent columnName ...
- VSCode开发Vue-代码格式化最完美设置
Vue在VsCode上面的开发,代码格式话是个老大难问题了. 有很多文章介绍Prettier四个配置方法,以及如何启用.但是结果就是:一个一个配完,还是看着难受 现在尝试出一种最完美格式化方式,分享出 ...
- Linux部分场景非常有用的命令集1_chattr&ldd&xargs&screen&ssh&磁盘&du
这里不做详细说明或截图,仅作为记录和简单说明.注:可能只针对某一命令部分功能,不包含整个功能,若要查看全部请自行查阅文档或help 1.chattr 当某一文件或目录,不想被无意修改或删除(即使roo ...
- [Python3]踩坑实录-优化技巧1
选择合适的数据结构 考虑不同的应用场景,应选择不同的数据结构 比如在查找多于插入的场景中,考虑字典Dict是不是更适合; 因为在Python3中, 字典Dict 通过hash把key映射到hash t ...
- jchdl - GSL实例 - Mux4(使用WireVec简化输入线声明)
https://mp.weixin.qq.com/s/yJx_dV6ScUStJtPWVuD38w 原理图 参考链接 https://github.com/wjcdx/jchdl/blob/ma ...
- 安装xlrd包的时候,总是报错:ERROR: Could not install packages due to an EnvironmentError: HTTPConnectionPool (host='127.0.0.1', port=8888):。。。
安装xlrd包的时候,总是报错:ERROR: Could not install packages due to an EnvironmentError: HTTPConnectionPool (ho ...
- 【HBase】与关系型数据库区别、行式/列式存储
[HBase]与关系型数据库区别 1.本质区别 mysql:关系型数据库,行式存储,ACID,SQL,只能存储结构化数据 事务的原子性(Atomicity):是指一个事务要么全部执行,要么不执行,也就 ...