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. 特效 css3 持续动作的渐变背景

    html,body{ margin:; padding:; height: 100%; width: 100%; background: linear-gradient(125deg,#2c3e50, ...

  2. go模板-代码生成器

    能用程序去做的事,就不要用手,编写自己的代码生成器就是用来解放你的双手,替你做一些重复性的工作. 上篇帖子写了模板的基础 go模板详说 ,有了基础就要做点什么东西,把所学到的东西应用起来才能更好的进步 ...

  3. [工具-006] C#如何模拟发包登录

    最近接到一个任务,就是模拟某个贴吧的登录发帖功能,我的思路是通过IE浏览器的工具对登陆操作进行抓包,记录登录时候请求的URL,请求方式,请求正文等信息进行模拟的发包. 1.首先我们要到登陆页面,以摇篮 ...

  4. Java集合(八)哈希表及哈希函数的实现方式

    Java集合(八)哈希表及哈希函数的实现方式 一.哈希表 非哈希表的特点:关键字在表中的位置和它之间不存在一个确定的关系,查找的过程为给定值一次和各个关键字进行比较,查找的效率取决于和给定值进行比较的 ...

  5. 读-写锁 ReadWriteLock & 线程八锁

    读-写锁 ReadWriteLock: ①ReadWriteLock 维护了一对相关的锁,一个用于只读操作, 另一个用于写入操作. 只要没有 writer,读取锁可以由 多个 reader 线程同时保 ...

  6. xxshenqi分析报告

    背景 今年七夕爆发了一场大规模手机病毒传播,apk的名字叫做xxshenqi.中了这个病毒的用户会群发手机所有联系人一条信息,内容是包含这个apk下载的链接,同时用户的联系人信息和短信会被窃取,造成隐 ...

  7. 关于ueditor编译器

    取消自动保存提示.edui-editor-messageholder.edui-default{ visibility:hidden;} Qiyuwen 1033935470@qq.com

  8. Java实现蓝桥杯分金币

    分金币 圆桌旁坐着n个人,每人有一定数量的金币,金币总数能被n整除.每个人可以给他左右相邻的人一些金币, 最终使得每个人的金币数目相等.你的任务是求出被转手的金币数量的最小值. 比如,n=4,且4个人 ...

  9. Java实现 LeetCode 204 计数质数

    204. 计数质数 统计所有小于非负整数 n 的质数的数量. 示例: 输入: 10 输出: 4 解释: 小于 10 的质数一共有 4 个, 它们是 2, 3, 5, 7 . class Solutio ...

  10. Java实现 蓝桥杯VIP 算法提高 格子位置

    算法提高 格子位置 时间限制:1.0s 内存限制:512.0MB 问题描述 输入三个自然数N,i,j (1<=i<=N,1<=j<=N),输出在一个N*N格的棋盘中,与格子(i ...