转载——用C#学数据结构(4)

链表

顺序表是用地址连续的存储单元顺序存储线性表中的各个数据元素,逻辑上相邻的数据元素在物理位置上也相邻。因此,在顺序表中查找任何一个位置上的数据元素非常方便,这是顺序存储的优点。

链式存储(Linked Storage)的线性表叫链表(Linked List)。不要求逻辑上相邻的数据元素在物理存储位置上也相邻,

在对链表进行插入和删除时不需要移动数据元素,但也失去了顺序表可随机存储的优点。

在存储数据元素时,除了存储数据元素本身的信息外,还要存储与它相邻的数据元素的存储地址信息。这两部分信息组成该数据元素的存储映像(Image),称为结点(Node)

存储据元素的域叫结点的数据域(Data Domain)

存储与它相邻的数据元素的存储地址信息的域叫引用域(Reference Domain)

一个基本的节点形式如下:

数据域

引用域

通常的使用如下形式表示:

Data

Next

C#中的节点类

C#中用LinkedListNode<T> 类实现节点,该类中包含一个值、对其所属的 LinkedList 的引用、对下一个节点的引用,以及对上一个节点的引用。可见它扩充了基本节点,具有更多的属性,各属性说明如下:

属性

说明

List

获取 LinkedListNode<T> 所属的 LinkedList<T>。

Next

获取 LinkedList<T> 中的下一个节点。 

Previous

获取 LinkedList<T> 中的上一个节点。 

Value 

获取节点中包含的值。 

C#中的链表类

LinkedList实现了链表类,它包含 LinkedListNode 类型的单独节点,如果节点及其值是同时创建的,则包含引用类型的列表性能会更好。由于LinkedListNode具有NextPrevious属性,因此LinkedList是双向链表。

LinkedList的属性和方法如下:

成员

说明

Count

获取LinkedList中实际包含的节点数

First

获取LinkedList的第一个节点

Last

获取LinkedList的最后一个节点

AddAfter

在LinkedList中的现有节点后添加新的节点或值 

AddBefore

在LinkedList中的现有节点前添加新的节点或值 

AddFirst

在LinkedList的开头处添加新的节点或值 

AddLast

在LinkedList的结尾处添加新的节点或值 

Clear

从LinkedList中移除所有节点 

Contains

确定某值是否在LinkedList中 

CopyTo

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

Find

查找包含指定值的第一个节点 

FindLast

查找包含指定值的最后一个节点 

Remove

从LinkedList中移除节点或值的第一个匹配项 

RemoveFirst

移除位于LinkedList开头处的节点 

RemoveLast

移除位于LinkedList结尾处的节点 

使用实例:将一个链表倒置

using System;

using System.Collections.Generic;

namespace DataStruct

{

    class Program

    {

        static void Main(string[] args)

        {

            LinkedList<int> LL = new LinkedList<int>();

            for (int i = 0; i < 10; i++)

            {

                LinkedListNode<int> lln = new LinkedListNode<int>(i + 1);

                LL.AddLast(lln);

            }

            ShowLinkedListData(LL);

            ReverseLinkedList(ref LL);

            ShowLinkedListData(LL);

 

            Console.Read();

        }

        public static void ShowLinkedListData(LinkedList<int> L)

        {

            foreach (int i in L)

                Console.Write(i.ToString() + " ");

            Console.WriteLine();

        }

        public static void ReverseLinkedList(ref LinkedList<int> L)

        {

            LinkedList<int> L2 = new LinkedList<int>();

            foreach (int i in L)

                L2.AddFirst(i);

            L = L2;

        }

    }

}

注意这里使用的按引用方式传递,所以会修改原始链表,如果不想修改的话,也可以使用按值传递参数,并返回一个LinkedList对象实例的方式。

posted on 2013-01-17 15:39  others  阅读(218)  评论(0)    收藏  举报

导航