节点

  public class ListNode
{
public ListNode(int NewValue)
{
Value = NewValue;
} //前一个
public ListNode Previous; // 后一个
public ListNode Next; // 值
public int Value;
}

单向链表内部方法组成

构造函数初始化,定义指针变量

   public Clist()
{
//构造函数
//初始化
ListCountValue = 0;
Head = null;
Tail = null;
} // 头指针
private ListNode Head; // 尾指针
private ListNode Tail; // 当前指针
private ListNode Current; //链表数据的个数
private int ListCountValue;

尾部添加数据

  //尾部添加数据
public void Append(int DataValue)
{
ListNode NewNode = new ListNode(DataValue); if (IsNull()) //如果头指针为空
{
Head = NewNode;
Tail = NewNode;
}
else
{
Tail.Next = NewNode;
NewNode.Previous = Tail;
Tail = NewNode;
}
Current = NewNode;
//链表数据个数加一
ListCountValue += 1;
}

删除当前数据

   //删除当前的数据
public void Delete()
{
//若为空链表
if (!IsNull())
{
//若删除头
if (IsBof())
{
Head = Current.Next;
Current = Head;
ListCountValue -= 1;
return;
} //若删除尾
if (IsEof())
{
Tail = Current.Previous;
Current = Tail;
ListCountValue -= 1;
return;
} //若删除中间数据
Current.Previous.Next = Current.Next;
Current = Current.Previous;
ListCountValue -= 1;
return;
}
}

移动数据

   // 向后移动一个数据
public void MoveNext()
{
if (!IsEof()) Current = Current.Next;
} // 向前移动一个数据
public void MovePrevious()
{
if (!IsBof()) Current = Current.Previous;
} // 移动到第一个数据
public void MoveFrist()
{
Current = Head;
} // 移动到最后一个数据
public void MoveLast()
{
Current = Tail;
} // 判断是否为空链表
public bool IsNull()
{
if (ListCountValue == 0)
return true; return false;
} // 判断是否为到达尾
public bool IsEof()
{
if (Current == Tail)
return true;
return false;
} // 判断是否为到达头部
public bool IsBof()
{
if (Current == Head)
return true;
return false; } public int GetCurrentValue()
{
return Current.Value;
} // 取得链表的数据个数
public int ListCount
{
get
{
return ListCountValue;
}
} // 清空链表
public void Clear()
{
MoveFrist();
while (!IsNull())
{
//若不为空链表,从尾部删除
Delete();
}
}

当前位置插入数据

 // 在当前位置前插入数据
public void Insert(int DataValue)
{
ListNode NewNode = new ListNode(DataValue);
if (IsNull())
{
//为空表,则添加
Append(DataValue);
return;
} if (IsBof())
{
//为头部插入
NewNode.Next = Head;
Head.Previous = NewNode;
Head = NewNode;
Current = Head;
ListCountValue += 1;
return;
}
//中间插入
NewNode.Next = Current;
NewNode.Previous = Current.Previous;
Current.Previous.Next = NewNode;
Current.Previous = NewNode;
Current = NewNode;
ListCountValue += 1;
}

升序插入

   // 进行升序插入
public void InsertAscending(int InsertValue)
{
//参数:InsertValue 插入的数据
//为空链表
if (IsNull())
{
//添加
Append(InsertValue);
return;
} //移动到头
MoveFrist();
if ((InsertValue < GetCurrentValue()))
{
//满足条件,则插入,退出
Insert(InsertValue);
return;
}
while (true)
{
if (InsertValue < GetCurrentValue())
{
//满族条件,则插入,退出
Insert(InsertValue);
break;
}
if (IsEof())
{
//尾部添加
Append(InsertValue);
break;
}
//移动到下一个指针
MoveNext();
}
}

降序插入

 //进行降序插入
public void InsertUnAscending(int InsertValue)
{
//参数:InsertValue 插入的数据
//为空链表
if (IsNull())
{
//添加
Append(InsertValue);
return;
}
//移动到头
MoveFrist();
if (InsertValue > GetCurrentValue())
{
//满足条件,则插入,退出
Insert(InsertValue);
return;
}
while (true)
{
if (InsertValue > GetCurrentValue())
{
//满族条件,则插入,退出
Insert(InsertValue);
break;
}
if (IsEof())
{
//尾部添加
Append(InsertValue);
break;
}
//移动到下一个指针
MoveNext();
}
}

C#单向链表的实现的更多相关文章

  1. Reverse Linked List II 单向链表逆序(部分逆序)

    0 问题描述 原题点击这里. 将单向链表第m个位置到第n个位置倒序连接.例如, 原链表:1->2->3->4->5, m=2, n =4 新链表:1->4->3-& ...

  2. 【编程题目】输入一个单向链表,输出该链表中倒数第 k 个结点

    第 13 题(链表):题目:输入一个单向链表,输出该链表中倒数第 k 个结点.链表的倒数第 0 个结点为链表的尾指针.链表结点定义如下: struct ListNode {int m_nKey;Lis ...

  3. 输出单向链表中倒数第k个结点

    描述 输入一个单向链表,输出该链表中倒数第k个结点,链表的倒数第0个结点为链表的尾指针. 链表结点定义如下: struct ListNode { int       m_nKey; ListNode* ...

  4. Linus:利用二级指针删除单向链表

    Linus大神在slashdot上回答一些编程爱好者的提问,其中一个人问他什么样的代码是他所喜好的,大婶表述了自己一些观点之后,举了一个指针的例子,解释了什么才是core low-level codi ...

  5. 【转】Linus:利用二级指针删除单向链表

    原文作者:陈皓 原文链接:http://coolshell.cn/articles/8990.html 感谢网友full_of_bull投递此文(注:此文最初发表在这个这里,我对原文后半段修改了许多, ...

  6. C语言实现单向链表及其各种排序(含快排,选择,插入,冒泡)

    #include<stdio.h> #include<malloc.h> #define LEN sizeof(struct Student) struct Student / ...

  7. 数据结构——Java实现单向链表

    结点类: /** * @author zhengbinMac * 一个OnelinkNode类的对象只表示链表中的一个结点,通过成员变量next的自引用方式实现线性表中各数据元素的逻辑关系. */ p ...

  8. 输入一个单向链表,输出该链表中倒数第K个结点

    输入一个单向链表,输出该链表中倒数第K个结点,具体实现如下: #include <iostream> using namespace std; struct LinkNode { publ ...

  9. 单向链表JAVA代码

        //单向链表类 publicclassLinkList{       //结点类     publicclassNode{         publicObject data;         ...

  10. C++ 单向链表反转

    单向链表反转,一道常见的面试题,动手实现下. #include "stdafx.h" #include <stdlib.h> struct Node{ int data ...

随机推荐

  1. 推荐给前端开发的 5 款 Chrome 扩展 🚀

    大家好,我是 dom 哥.这是我关于 Chrome 扩展开发的系列文章,感兴趣的可以 点个小星星. 工欲善其事,必先利其器.Chrome 可能是前端开发中使用最多的浏览器.在日常开发中,下列几款 Ch ...

  2. Scrapy创建项目、爬虫文件

    创建项目 执行命令 scrapy startproject <项目名> 项目结构 创建爬虫文件 方式一:通过命令生成 scrpay genspider <爬虫名(必须唯一)> ...

  3. TypeScript Vs JavaScript 区别

    一.观察 1. JS 平常的复制类型 let val; val = 123; val = "123"; val = true; val = [1, 3, 5]; 注意点: 由于JS ...

  4. 简单几行实现sliver上线提醒

    准备魔改sliver去掉一些特征什么的,这里记录一下最简单实现上线消息通过企业微信机器人提醒的方式,这很简单也有很多不足还需要接着改的 protobuf中对消息Beacon和Session的定义如下, ...

  5. Python——第五章:csv模块

    未来我们会使用爬虫获取到一些json文件,例如去英雄联盟官方爬取英雄的数据库 查看代码 {"hero":[{"heroId":"1",&qu ...

  6. Python——第五章:time模块、datetime模块

    time模块 在平常的代码中,我们常常需要与时间打交道.在Python中,与时间处理有关的模块就包括:time,datetime,calendar(很少用,不讲),下面分别来介绍. 我们写程序时对时间 ...

  7. Java反序列化漏洞-CC6链分析

    CC6利用链分析 经过之前对CC1链和URLDNS链的分析,现在已经对反序列化利用链有了初步的认识,这次来分析一个最好用的CC利用链--CC6. 为什么CC6是最好用的CC利用链,因为CC6不限制jd ...

  8. 技术实践丨PostgreSQL开启Huge Page场景分析

    PostgreSQL用户经常发现,服务端在连接数较大的情况下,会出现系统内存消耗过多的情况,严重者可能会造成OOM.但是服务端配置的共享内存(shared_buffers,wal_buffers等)是 ...

  9. 华为亮相KubeCon EU 2023 新云原生开源项目Kuasar推动“云上演进”

    摘要:协力同行.拥抱开源,解放数字生产力,为社会和行业带来更多价值. 在数字时代,如果说企业是一艘巨大的货船,那么云原生则为企业的每一个业务.每一个应用提供了标准化的集装箱,摆脱笨重的底层桎梏,打造新 ...

  10. SQL Server 项目中 SQL 脚本更新、升级方式,防止多次重复执行

    MySQL 项目中 SQL 脚本更新.升级方式,防止多次重复执行 Oracle 项目中 SQL 脚本更新方式 一套代码,多家部署时,在SQL脚本升级时,通过一个SQL文件给运维,避免出现SQL执行序顺 ...