学习单链表的源码项目:http://files.cnblogs.com/xmfdsh/CSharp%E5%8D%95%E9%93%BE%E8%A1%A8.rar

链表是用一组任意的存储单元来存储线性表中的数据元素(在存储单元中可以是连续的,也可以是不连续的)。链表在存储数据元素时,除了存储数据元素本身的信息外,还要存储与它相邻的数据元素的存储地址信息。这两部分信息组成该数据元素的存储映像,称为节点。

节点的形象图如下:

首先定义一个类Node来表示这些节点:

public class Node<T>
{
private T data; //数据域
private Node<T> next; //引用域 #region 构造函数
/// <summary>
/// 构造函数
/// </summary>
/// <param name="val"></param>
/// <param name="p"></param>
public Node(T val, Node<T> p)
{
data = val;
next = p;
}
public Node(Node<T> p)
{
next = p;
}
public Node(T val)
{
data = val;
next = null;
}
public Node()
{
data = default(T);
next = null;
}
#endregion //数据域属性
public T Data
{
get
{
return data;
}
set
{
data = value;
}
}
//引用域属性
public Node<T> Next
{
get
{
return next;
}
set
{
next = value;
}
}
}

通常,我们把链表化成用箭头相连接的节点序列,节点间的箭头表示引用域中存储的地址。具体单链表的形式表示如下:

网上找到 图片,把循环列表 和 双向链表都弄上去了,也好提前了解下

因此要定义一个类表示整个链表,其中中间当然运用到了之前写Node类,类中的属性如下:

       private Node<T> head;//单链表头引用
//头引用属性
public Node<T> Head
{
get
{
return head;
}
set
{
head = value;
}
}
//构造函数
public LinkList()
{
head = null;
}

接下来就是实现之前讲的顺序表中定义好的接口 http://www.cnblogs.com/xmfdsh/p/3698456.html

        //求单链表长度
public int GetLength()
{
Node<T> p = head;
int len = ;
while(p!=null)
{
len++;
p = p.Next;
}
return len;
}
//清空单链表
public void Clear()
{
head = null;
} public bool IsEmpty()
{
if(head==null)
{
return true;
}
else
{
return false;
}
} public bool IsFull()
{
throw new NotImplementedException();
}
//在单链表末尾添加新元素
public void Append(T item)
{
Node<T> q = new Node<T>(item);
Node<T> p = new Node<T>();
if(head==null)
{
head = q;
return;
}
p = head;
while(p.Next!=null)
{
p = p.Next;
}
p.Next = q;
}
//在单链表第i个节点位置插入一个item的节点
public void Insert(T item, int i)
{
if(IsEmpty()||i<)
{
Console.WriteLine("链表为空或插入位置不允许");
return;
}
if (i == )
{
Node<T> q = new Node<T>(item);
q.Next = head;
head = q;
return;
}
Node<T> p = head;
Node<T> r = new Node<T>();
int j = ;
while (p.Next != null && j < i)
{
r = p;
p = p.Next;
j++;
}
if (j == i)
{
Node<T> q = new Node<T>(item);
q.Next = p;
r.Next = q;
}
}
//删除单链表第i节点
public T Delete(int i)
{
if(IsEmpty()||i<)
{
Console.WriteLine("链表为空或删除位置不允许");
return default(T);
}
Node<T> q = new Node<T>();
if (i == )
{
q = head;
head = head.Next;
return q.Data;
}
Node<T> p = head;
int j = ;
while (p.Next != null && j < i)
{
j++;
q = p;
p = p.Next;
}
if (j == i)
{
q.Next = p.Next;
return p.Data;
}
else
{
Console.WriteLine("删除的节点不存在");
return default(T);
} }
//获取单链表第i个数据元素
public T GetElem(int i)
{
if (IsEmpty() || i < )
{
Console.WriteLine("链表为空或者获取位置不允许");
return default(T);
}
Node<T> p = new Node<T>();
p = head;
int j = ;
while (p.Next != null && j < i)
{
p = p.Next;
j++;
}
if (j == i)
{
return p.Data;
}
else
{
Console.WriteLine("要获取的节点不存在");
return default(T);
}
}
//在单链表中查找值为value的节点
public int Locate(T value)
{
if (IsEmpty())
{
Console.WriteLine("链表为空");
return -;
}
Node<T> p = new Node<T>();
p = head;
int i = ;
while (!p.Data.Equals(value) && p.Next != null)
{
p = p.Next;
i++;
}
return i;
}

实现这些接口都不难,还是要理解链表的具体操作原理,只是记代码是没用的,不用多久就忘的差不多,p.Next等这些地方可以联想到C中的指针,不过C中的指针有时挺危险的,C#中的也许就安全多了吧。

然后再玩玩一些经典题目,首先就是单链表倒置

        //-----------------------------------单链表扩展方法---------------------------------------------
/// <summary>
/// 单链表倒置
/// </summary>
/// <param name="H"></param>
public void ReversLinkList(LinkList<T> H)
{
Node<T> p = H.head;
Node<T> q = new Node<T>();
H.head.Next = null;
while (p != null)
{
q = p;
p = p.Next;
q.Next = H.head.Next;
H.head.Next = q;
}
}

再做个题目:构造单链表Hb,要求Hb只包含Ha表中所有值不相同节点

        /// <summary>
/// 构造单链表Hb,要求Hb只包含Ha表中所有值不相同节点
/// </summary>
/// <param name="Ha"></param>
/// <returns></returns>
public LinkList<T> Purge(LinkList<T> Ha)
{
LinkList<T> Hb = new LinkList<T>();
Node<T> p = Ha.head;
Node<T> q = new Node<T>();
Node<T> s = new Node<T>(); s = p;
p = p.Next;
s.Next = null;
Hb.head.Next = s;
while (p != null)
{
s = p;
p = p.Next;
q = Hb.head;
while(q!=null&&!(q.Data.Equals(s.Data)))
{
q = q.Next;
}
if(q==null)
{
s.Next = Hb.head;
Hb.head = s;
}
}
return Hb;
}

C#单链表(数据结构)的更多相关文章

  1. 单链表数据结构 - java简单实现

    链表中最简单的一种是单向链表,每个元素包含两个域,值域和指针域,我们把这样的元素称之为节点.每个节点的指针域内有一个指针,指向下一个节点,而最后一个节点则指向一个空值.如图就是一个单向链表 一个单向链 ...

  2. 数据结构之单链表的实现-java

    一.单链表基本概念 单链表是一种链式存取的数据结构,用一组地址任意的存储单元(一般是非连续存储单元)存放线性表中的数据元素.链表中的数据是以结点来表示的,每个结点的构成:元素data + 指针next ...

  3. 单链表 C++ 实现 - 含虚拟头节点

    本文例程下载链接:ListDemo 链表 vs 数组 链表和数组的最大区别在于链表不支持随机访问,不能像数组那样对任意一个(索引)位置的元素进行访问,而需要从头节点开始,一个一个往后访问直到查找到目标 ...

  4. 数据结构图文解析之:数组、单链表、双链表介绍及C++模板实现

    0. 数据结构图文解析系列 数据结构系列文章 数据结构图文解析之:数组.单链表.双链表介绍及C++模板实现 数据结构图文解析之:栈的简介及C++模板实现 数据结构图文解析之:队列详解与C++模板实现 ...

  5. 数据结构与算法分析——C语言描述 第三章的单链表

    数据结构与算法分析--C语言描述 第三章的单链表 很基础的东西.走一遍流程.有人说学编程最简单最笨的方法就是把书上的代码敲一遍.这个我是头文件是照抄的..c源文件自己实现. list.h typede ...

  6. 数据结构(C语言第2版)----时间复杂度和单链表

    马上要到校招了,复习下相关的基础知识. 时间复杂度是什么? 官方解释: 算法的执行时间需要依据算法所编制的程序在计算机上于运行时所消耗的时间来度量.在算法中可以使用基本的语句的执行次数作为算法的时间复 ...

  7. 数据结构算法C语言实现(二)---2.3线性表的链式表示和实现之单链表

    一.简述 [暂无] 二.头文件 #ifndef _2_3_part1_H_ #define _2_3_part1_H_ //2_3_part1.h /** author:zhaoyu email:zh ...

  8. python 数据结构之单链表的实现

    链表的定义: 链表(linked list)是由一组被称为结点的数据元素组成的数据结构,每个结点都包含结点本身的信息和指向下一个结点的地址.由于每个结点都包含了可以链接起来的地址信息,所以用一个变量就 ...

  9. C# 数据结构--单链表

    什么是单链表 这两天看到很多有关单链表的面试题,对单链表都不知道是啥的我.经过学习和整理来分享一下啥是单链表和单链表的一些基本使用方法.最后看些网上有关单链表的面试题代码实例. 啥是单链表? 单链表是 ...

随机推荐

  1. java枚举类型使用笔记

    1.values()方法返回枚举所有实例的一个数组,调用这个数组的length方法,可以得到这个枚举对象中实例的个数 2.枚举类的每个实例,其实都是static的,可以通过static方法直接调用,而 ...

  2. css3圆角边框,边框阴影

    border-radius向元素添加圆角边框,css3中的.IE9+ chrome safari5+ firefox4+ 现在都支持.可以向input div等设置边框.与border相似,可以四个角 ...

  3. 批量删除的js代码

    <script type="text/javascript"> function seltAll(){ var chckBoxSign = document.getEl ...

  4. 基于OWIN WebAPI

    http://www.cnblogs.com/Irving/p/4607104.html http://www.cnblogs.com/xishuai/p/aspnet-webapi-owin-oau ...

  5. Oracle private dblink和pubic dblink

    DB : 11.2.0.3.0 Oracle DBLINK 创建分为private 和 public dblink,默认创建的为private ; private dblink 只有创建的schema ...

  6. 11G ORACLE RAC DBCA 无法识别asm磁盘组

    ASM磁盘无法识别几种现象: 1) gi家目录或者其子目录权限错误 2)asm磁盘的权限错误 3)asm实例未启动或者asm磁盘组没有mount上 4)asm磁盘组资源没有在线 5)oracle用户的 ...

  7. 九度oj 1528 最长回文子串

    原题链接:http://ac.jobdu.com/problem.php?pid=1528 小白书上的做法,不过这个还要简单些... #include<algorithm> #includ ...

  8. 推荐几款web站点JS(JQeury)图表(饼图,柱图,线图)

    一 Google Chart Tools 官网:https://developers.google.com/chart/ 谷歌图表工具提供了一个完美的方式形象化您的网站上的数据.从简单到复杂的层次结构 ...

  9. 调整maven配置文件

    maven的配置文件位置:maven安装位置\conf\settings.xml. 这次调整maven的配置文件主要解决三个问题: 调整本地依赖库位置 设置代理 添加远程资源库镜像节点 调整本地依赖库 ...

  10. Python实现kMeans(k均值聚类)

    Python实现kMeans(k均值聚类) 运行环境 Pyhton3 numpy(科学计算包) matplotlib(画图所需,不画图可不必) 计算过程 st=>start: 开始 e=> ...