《数据结构与算法C#语言描述》笔记11_链表

十一.链表

两种不同的实现:基于对象的链表、基于数组的链表

 

数组存在的问题

在无需数组中查找一个数据项是很慢的;有序(排序)数组对查找而言会更加高效,但是插入和删除操作还是很慢。

 

链表的定义

链表是被称为节点的类对象的群集。每个节点通过一个链接到列表内的后记节点。

节点包括存储数据的字段节点引用的字段。节点引用的字段被称为是链接。

对链表结尾的标记,是通过指向空(null)值实现的。

插入操作:把要插入节点之前的链接改为指向要插入的节点,并把新节点的链接设为指向插入之前前节点所指向的节点。

移出操作:把要删除的节点之前节点的链接重新定向到删除节点所指向的节点,并把删除节点的连接设置为null。

面向对象链接的设计

节点是由两个数据成员组成:存储着节点的数据Element、指向表内下一节点引用的链接Link

链表多个节点之间的链接。这个链表类包括几种方法:把节点添加到链表的方法、从链表中移除节点的方法、遍历链表的方法、找到链表内节点的方法。还包括唯一的数据成员:头节点

链表设计的改进方案:

双向链表

增加了一个指向前一个节点的链接。

循环链表

把尾节点指向首节点。

.NET框架库是用循环链表的设计来实现ArrayList数据结构的。

LinkedList类和LinkedListNode类

LinkedList表示一个双向链表。

LinkedListNode类则表示 LinkedList<T> 中的节点。

 

namespace System.Collections.Generic

    // 摘要:

    //     表示双向链表。

    //

    // 类型参数:

    //   T:

    //     指定链表的元素类型。

public classLinkedList<T> : ICollection<T>,IEnumerable<T>,ICollection, IEnumerable,ISerializable,IDeserializationCallback

 

 

    // 摘要:

    //     表示System.Collections.Generic.LinkedList<T>中的节点。无法继承此类。

    //

    // 类型参数:

    //   T:

    //     指定链表的元素类型。

    [ComVisible(false)]

    public sealed class LinkedListNode<T>

LinkedList常用成员

Count属性,获取LinkedList 中实际包含的节点数。

First属性,获取LinkedList 的第一个节点。

Last属性,获取LinkedList 的最后一个节点。

 

AddAfter方法,在 LinkedList 中的现有节点后添加新的节点或值。

AddBefore方法,在 LinkedList 中的现有节点前添加新的节点或值。

AddFirst方法,在 LinkedList 的开头处添加新的节点或值。

AddLast方法,在 LinkedList 的结尾处添加新的节点或值。

Clear方法,从 LinkedList 中移除所有节点。

Contains方法,确定某值是否在 LinkedList 中。

CopyTo 方法,从目标数组的指定索引处开始将整个 LinkedList 复制到兼容的一维Array。

Find方法,查找包含指定值的第一个节点。

FindLast方法,查找包含指定值的最后一个节点。

GetEnumerator方法,返回循环访问 LinkedList 的枚举数。

Remove方法,从 LinkedList 中移除节点或值的第一个匹配项。

RemoveFirst方法,移除位于 LinkedList 开头处的节点。

RemoveLast方法,移除位于 LinkedList 结尾处的节点。

 

LinkedListNode常用成员

List属性,获取LinkedListNode<T> 所属的LinkedList<T>。

Next属性,获取LinkedList<T> 中的下一个节点。

Previous 属性,获取LinkedList<T> 中的上一个节点。

Value属性,获取节点中包含的值。

 

 

           LinkedList<int> ll =new LinkedList<int>();///双向链表

           LinkedListNode<int> lln =new LinkedListNode<int>(12);

           LinkedListNode<int> lln1 =new LinkedListNode<int>(22);

           LinkedListNode<int> lln2 =new LinkedListNode<int>(32);

           LinkedListNode<int> lln3 =new LinkedListNode<int>(42);

           ll.AddFirst(lln);

           ll.AddFirst(lln1);

           ll.AddFirst(lln2);

           ll.AddFirst(lln3);

           ll.AddAfter(lln2, 2);

           ll.AddLast(new LinkedListNode<int>(-2));

           ll.AddLast(new LinkedListNode<int>(2));

           ll.RemoveFirst();

           ll.Remove(ll.Find(2));

           LinkedListNode<int> oneNode =newLinkedListNode<int>(0);

           ///遍历

           oneNode = ll.First;

           while (oneNode != null)

           {

               Console.WriteLine(oneNode.Value);

               oneNode = oneNode.Next;

           }

           ///32

           ///22

           ///12

           ///-2

           ///2


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值