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%. 为什么链表代 ...
随机推荐
- Gym101142G Gangsters in Central City
题目链接:https://cn.vjudge.net/problem/Gym-101142G 知识点: DFS序.LCA 题目大意: 给定一棵有根树(根为 \(1\)).每次修改叶子节点会被染成黑色( ...
- 远程快速安装mysql
远程服务器安装mysql数据库 https://www.cnblogs.com/renjidong/p/7047396.html 1.新开的云服务器,需要检测系统是否自带安装mysql # yum l ...
- EL表达式用法---查询博客
jsp脚本:<%=request.getAttribute(name)%>EL表达式替代上面的脚本:${requestScope.name} 使用EL最主要的作用是获得四大域中的数据,格式 ...
- Python的大小整数池跟深浅copy
一.小整数池 可变的数据类型:list dict set 可变: 就是里面的数据类型变了,但是指向的内存地址没变. 不可变的数据类型:str 数值类型 tuple 不可变:如果改变了里面的值,相应的只 ...
- SpringBoot整合SpringSecurity实现JWT认证
目录 前言 目录 1.创建SpringBoot工程 2.导入SpringSecurity与JWT的相关依赖 3.定义SpringSecurity需要的基础处理类 4. 构建JWT token工具类 5 ...
- sql注入讲解
1.输入1' 发现数据库报错,原因是我们的输入直接被代入到数据库查询语句里面. 2.有没有办法可以不让他报错呢?可以尝试一下构造正确的数据库语法,使之不报错.比如输入 1 and 1=1 试试 sel ...
- 一个 json 转换工具
在前后端的数据协议(主要指http和websocket)的问题上,如果前期沟通好了,那么数据协议上问题会很好解决,前后端商议一种都可以接受的格式即可.但是如果接入的是老系统.第三方系统,或者由于某些奇 ...
- Python--numpy中的tile()函数
首先是官方给的定以(我是用的VsCode,鼠标放置在tile上出现的),建议直接看后面的示例. def tile(A, reps) Construct an array by repeating ...
- Rocket - debug - TLDebugModuleInner - HALTSUM
https://mp.weixin.qq.com/s/elOGjaVCWc48gs9c_cTqww 简单介绍TLDebugModuleInner中HALTSUM寄存器的实现. 1. numHalted ...
- Rocket - jtag - JtagTap
https://mp.weixin.qq.com/s/0u9jM2u-FkTlrk3QNuZaBw 简单介绍JtagTap的实现. 1. 简单介绍 定义TAP(Test Access Port)所需要 ...