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)的更多相关文章

  1. 数据结构与算法系列2 线性表 链表的分类+使用java实现链表+链表源码详解

    数据结构与算法系列2.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 ...

  3. javascript实现数据结构与算法系列:栈 -- 顺序存储表示和链式表示及示例

    栈(Stack)是限定仅在表尾进行插入或删除操作的线性表.表尾为栈顶(top),表头为栈底(bottom),不含元素的空表为空栈. 栈又称为后进先出(last in first out)的线性表. 堆 ...

  4. 数据结构与算法系列2 线性表 使用java实现动态数组+ArrayList源码详解

    数据结构与算法系列2 线性表 使用java实现动态数组+ArrayList源码详解 对数组有不了解的可以先看看我的另一篇文章,那篇文章对数组有很多详细的解析,而本篇文章则着重讲动态数组,另一篇文章链接 ...

  5. javascript实现数据结构与算法系列:线性表的静态单链表存储结构

    有时可借用一维数组来描述线性链表,这就是线性表的静态单链表存储结构. 在静态链表中,数组的一个分量表示一个结点,同时用游标(cur)代替指针指示结点在数组中的相对位置.数组的第0分量可看成头结点,其指 ...

  6. C#数据结构与算法系列(五):常见单链表笔试

    1.求单链表中有效节点个数 public static int GetLength(HeroNode headNode) { int length = ; var cur = headNode.Nex ...

  7. C#数据结构与算法系列(六):链表——双链表(Double-LinkedList)

    1.对比单向链表 单向链表查找的方向只能是一个方向,而双向链表可以向前或者向后查找 单向链表不能自我删除,需要靠辅助节点,而双向链表可以自我删除 对于单向链表的删除,我们首先要找到单向链表待删除节点的 ...

  8. 数据结构与算法系列研究七——图、prim算法、dijkstra算法

    图.prim算法.dijkstra算法 1. 图的定义 图(Graph)可以简单表示为G=<V, E>,其中V称为顶点(vertex)集合,E称为边(edge)集合.图论中的图(graph ...

  9. 《数据结构与算法之美》 <05>链表(下):如何轻松写出正确的链表代码?

    想要写好链表代码并不是容易的事儿,尤其是那些复杂的链表操作,比如链表反转.有序链表合并等,写的时候非常容易出错.从我上百场面试的经验来看,能把“链表反转”这几行代码写对的人不足 10%. 为什么链表代 ...

随机推荐

  1. 推荐一款复式记账软件——GnuCash

    本文需要搞清楚两个事情,第一,什么是复式记账:第二,GnuCash操作 复式记账,来自百度百科的解释:复式记账法是以资产与权益平衡关系作为记账基础,对于每一笔经济业务,都要以相等的金额在两个或两个以上 ...

  2. 枚举 转化为可行性判定问题 网络流 poj3189

    Steady Cow Assignment Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6914   Accepted: ...

  3. 启动独立的tomcat服务器,没有自动创建ServletContext,对Context生命周期的监听失败

    1.可能web.xml文件里对ContextListener没有进行配置 2.web.xml文件有关对ContextListener的配置,出现了错误的单词拼写问题 比如 <listener&g ...

  4. Java 面向对象基础

    面向对象的基础 局部变量和成员变量区别: 1)定义的位置不同    成员变量直接定义在class中    局部变量在某个{}中或者再某个方法中 2)在内存中的位置不同    对象的成员变量会在内存中的 ...

  5. 基于 abp vNext 和 .NET Core 开发博客项目 - 使用Redis缓存数据

    上一篇文章(https://www.cnblogs.com/meowv/p/12943699.html)完成了项目的全局异常处理和日志记录. 在日志记录中使用的静态方法有人指出写法不是很优雅,遂优化一 ...

  6. StreamSets使用指南

    StreamSets使用指南 最近在调研Streamsets,照猫画虎做了几个最简单的Demo鉴于网络上相关资料非常少,做个记录. 1.简介 Streamsets是一款大数据实时采集和ETL工具,可以 ...

  7. CF1353E K-periodic Garland(贪心/dp)

    Question 有n盏灯,0代表暗,1代表亮,相邻两个1之间为周期k,求出最少的改变次数 Solution First 贪心方法 详见博客https://blog.csdn.net/cheng__y ...

  8. MySQL所有的安装部署方式

    目录 一.前言 二.关于MySQL的安装 三.部署规划 3.1 服务器规划 3.2 数据库目录规划 四.准备工具 五.通用二进制包安装MySQL 5.1 上传MySQL通用二进制安装包到node7的/ ...

  9. Ratel源码-C/S事件梳理

    一.Ratel介绍 Ratel 是一个可以在命令行中玩斗地主的项目,可以使用小巧的jar包在拥有JVM环境的终端中进行游戏,同时支持人人对战和人机对战两种模式,丰富你的空闲时间! 二.玩法Demo 三 ...

  10. 【RT-Thread笔记】BH1750软件包的使用

    BH1750简介 BH1750是一种用于两线制串行总线接口的16位数字型光强度传感器集成电路.利用它的高分辨率可以探测较大范围的光强度变化.(1lx~65535lx). 创建工程.验证 在RT-Thr ...