学习单链表的源码项目: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. 5.html5中的路径表示

    路径在html中的作用主要是进行外部资源的引入,如css文件,js文件,媒体文件等. 而路径本身有分为相对路径和绝对路径.所谓相对路径,就是相对于链接页面而言的另一个页面的路径.而绝对路径,就是直接从 ...

  2. gem

    bundle gem xxxrake build gem push pkg/xxx.gem rake releaserake install

  3. hdu 3074 Multiply game

    题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=3074 Minimum Inversion Number Description Tired of pl ...

  4. Windows Phone8.1 SDK中的新控件

    前言      WP8.1对开发者的影响要远大于对用户的影响.这篇博客就来一起看看哪些WP8.0中的控件被移除或替换,这些控件的介绍在MSDN上都非常的详细,所以这里只给出一些简单的介绍,来对比8.1 ...

  5. Go中简单的文件读写

    Go中的ioutil包可以方便的实现文件读写.代码: package main import ( "fmt" "io/ioutil" ) func main() ...

  6. Mac OSX 快捷键&命令行总览

    大家初用Mac OSX可能不习惯,特别收集总结了Mac OSX 上的快捷键,方便大家参考 ,请叫我雷锋. 一.Mac OSX 快捷键 ctrl+shift                       ...

  7. Swift Tips - 在 Swift 中自定义下标访问

    Untitled Document.md input[type="date"].form-control,.input-group-sm>input[type="d ...

  8. MVVMLight leaning note

    Learning Note For MvvmLight MvvmLight quitstart refer link1 : MVVMLight HelloWorld *** mc:Ignorable ...

  9. homework-05 大家一起玩游戏~

    046  195 1.接口设计 客户端 用户登录后,启动一个线程来进行游戏,等待服务器信息及发送新数据 服务器  开始时,主程序一直等待用户登录,有新用户登录就开一个线程去为其服务 等到用户都登录完成 ...

  10. js从富文本中找出固定电话、手机号码、邮箱并添加上链接。

    function richtextfindtel(value) { /*固定电话.手机号码.邮箱*/ var tempValue = value.replace(/<[^>]+>/g ...