创建一个简单的线性链表

对于阅读本文的那些从未创建过线性链表的人。你可以将线性链表想像成有一条链子栓在一起的盒子(称作一个结点),每个盒子里包含着一些数据 和 链接到这个链子上的下一个盒子的引用(当然,除了最后一个盒子,这个盒子对于下一个盒子的引用被设置成NULL)。

公司主营业务:网站设计制作、成都网站制作、移动网站开发等业务。帮助企业客户真正实现互联网宣传,提高企业的竞争能力。创新互联建站是一支青春激扬、勤奋敬业、活力青春激扬、勤奋敬业、活力澎湃、和谐高效的团队。公司秉承以“开放、自由、严谨、自律”为核心的企业文化,感谢他们对我们的高要求,感谢他们从不同领域给我们带来的挑战,让我们激情的团队有机会用头脑与智慧不断的给客户带来惊喜。创新互联建站推出海阳免费做网站回馈大家。

为了创建我们的简单线性链表,我们需要下面三个类:

1、Node 类,包含数据以及下一个Node的引用。

2、LinkedList 类,包含链表中的第一个Node,以及关于链表的任何附加信息。

3、测试程序,用于测试 LinkedList 类。

为了查看链接表如何运作,我们添加Objects的两种类型到链表中:整型 和 Employee类型。你可以将Employee类型想象成一个包含关于公司中某一个员工所有信息的类。出于演示的目的,Employee类非常的简单。

 
 
 
  1. public class Employee{  
  2.   private string name;  
  3.   public Employee (string name){  
  4.     this.name = name;  
  5.   }  
  6.  
  7.   public override string ToString(){  
  8.    return this.name;  
  9.   }  

这个类仅包含一个表示员工名字的字符串类型,一个设置员工名字的构造函数,一个返回Employee名字的ToString()方法。

链接表本身是由很多的Node构成,这些Note,如上面所说,必须包含数据(整型 和 Employee)和链表中下一个Node的引用。

 
 
 
  1. public class Node{  
  2.     Object data;  
  3.     Node next;  
  4.  
  5.     public Node(Object data){  
  6.        this.data = data;  
  7.        this.next = null;  
  8.     }  
  9.  
  10.     public Object Data{   
  11.        get { return this.data; }  
  12.        set { data = value; }  
  13.     }  
  14.  
  15.     public Node Next{  
  16.         get { return this.next; }  
  17.        set { this.next = value; }  
  18.     }  

注意构造函数将私有的数据成员设置成传递进来的对象,并且将 next 字段设置成null。

这个类还包括一个方法,Append,这个方法接受一个Node类型的参数,我们将把传递进来的Node添加到列表中的最后位置。这过程是这样的:首先检测当前Node的next字段,看它是不是null。如果是,那么当前Node就是最后一个Node,我们将当前Node的next属性指向传递进来的新结点,这样,我们就把新Node插入到了链表的尾部。

如果当前Node的next字段不是null,说明当前node不是链表中的最后一个node。因为next字段的类型也是node,所以我们调用next字段的Append方法(注:递归调用),再一次传递Node参数,这样继续下去,直到找到最后一个Node为止。

 
 
 
  1. public void Append(Node newNode){  
  2.     if ( this.next == null ){  
  3.        this.next = newNode;  
  4.     }else{  
  5.        next.Append(newNode);  
  6.     }  

Node 类中的 ToString() 方法也被覆盖了,用于输出 data 中的值,并且调用下一个 Node 的 ToString()方法(译注:再一次递归调用)。

 
 
 
  1. public override string ToString(){  
  2.     string output = data.ToString();  
  3.  
  4.     if ( next != null ){  
  5.        output += ", " + next.ToString();  
  6.     }  
  7.  
  8.     return output;  

这样,当你调用第一个Node的ToString()方法时,将打印出所有链表上Node的值。

LinkedList 类本身只包含对一个Node的引用,这个Node称作 HeadNode,是链表中的第一个Node,初始化为null。

 
 
 
  1. public class LinkedList{  
  2.     Node headNode = null;  

LinkedList 类不需要构造函数(使用编译器创建的默认构造函数),但是我们需要创建一个公共方法,Add(),这个方法把 data存储到线性链表中。这个方法首先检查headNode是不是null,如果是,它将使用data创建结点,并将这个结点作为headNode,如果不是null,它将创建一个新的包含data的结点,并调用headNode的Append方法,如下面的代码所示:

 
 
 
  1. public void Add(Object data){  
  2.     if ( headNode == null ){  
  3.        headNode = new Node(data);  
  4.     }else{  
  5.        headNode.Append(new Node(data));  
  6.     }  

为了提供一点集合的感觉,我们为线性链表创建一个索引器。

 
 
 
  1. public object this[ int index ]{  
  2.     get{  
  3.        int ctr = 0;  
  4.        Node node = headNode;  
  5.        while ( node != null  && ctr <  = index ){  
  6.            if ( ctr == index ){  
  7.               return node.Data;  
  8.            }else{  
  9.               node = node.Next;  
  10.            }  
  11.            ctr++;  
  12.         }  
  13.     return null;  
  14.     }  

最后,ToString()方法再一次被覆盖,用以调用headNode的ToString()方法。

 
 
 
  1. public override string ToString(){  
  2.     if ( this.headNode != null ){  
  3.        return this.headNode.ToString();  
  4.     }else{  
  5.        return string.Empty;  
  6.     }  

这样,一个线性链表就创建好了。

【编辑推荐】

  1. C# winForm自定义鼠标样式的两种方法
  2. C#自定义消息框的设置图解
  3. 掌握C#自定义泛型类:从初始化说起
  4. C#存储过程的循序渐进
  5. 存储过程的优势及其调用方法介绍

网页名称:创建一个简单的线性链表
标题URL:http://www.zyruijie.cn/qtweb/news6/2556.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联