单链表的实现

在单链表中,我们需要在内部有一个头节点,我们可以通过这个头节点找到其他的节点,相当于一个线索。

纵观顺序结构的线性表和单链表的实现,难点基本上都在于添加和删除操作。基于数组的线性表中,数组的索引就相当于是线性表的序号,但在单链表中,我们没有序号这个东西,所以在添加和删除操作中,我们需要先找到指定的元素,然后才能继续进行操作。在插入操作中,我们需要同时保存有当前节点的前一个节点和当前的节点,因为当前要插入的节点要放在前一个节点的Next引用域,而当前节点要放在要插入节点的next域。删除节点与此相似。

 

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

namespace DataStructure

{

    class LinkList<T> : IListDS<T>

    {

 

        class Node<T>

        {

 

            private T data;

            /// <summary>

            /// 数据域

            /// </summary>

            public T Data

            {

                get { return data; }

                set { data = value; }

            }

 

 

            private Node<T> next;

            /// <summary>

            /// 引用域

            /// </summary>

            public Node<T> Next

            {

                get { return next; }

                set { next = value; }

            }

 

            //头结点构造函数

            public Node(Node<T> node)

                : this(default(T), node)

            {

            }

            //普通结点构造函数

            public Node(T data, Node<T> node)

            {

                this.Data = data;

                this.Next = node;

            }

            /// <summary>

            /// 空构造函数

            /// </summary>

            public Node()

                : this(default(T), null)

            {

            }

            //尾结点构造函数

            public Node(T data)

                : this(data, null)

            {

 

            }

        }

 

        private Node<T> Head;

     

        public LinkList()

        {

 

        }

 

        public int Lenth

        {

            get { return this.GetLength(); }

        }

       

        public LinkList(T[] t)

        {

            this.Head = new Node<T>(t[0]);

            Node<T> Last;

            Last = Head;

            for (int i = 1; i < t.Length; i++)

            {

                //尾插入法

                Last.Next = new Node<T>(t[i]);

                Last = Last.Next;

            }

        }

        public States Append(T item)

        {

            //(1)头结点没有

            if (Head==null)

            {

                Head = new Node<T>(item);

            }

            //(2)正常的插入情况

            Node<T> Last;

            Last=Head;

            //遍历到最后一个结点,在最后一个结点附加上

            while (null!=Last.Next)

            {

                Last = Last.Next;

            }

            Last.Next = new Node<T>(item);

            return States.Success;

        }

 

        public void Clear()

        {

            this.Head = null;

        }

 

        public T Delete(int index, out States states)

        {

            bool isIndexTrue = index < 0 || index >= this.GetLength();

            if (IsEmpty() == true || isIndexTrue)

            {

                states = States.Fail;

                return default(T);

            }

            //找到指定的结点

            Node<T> Current = Head;

            Node<T> Previous = Head;

            int Count = 0;

            while (Count != index && Current.Next != null)

            {

                Previous = Current;

                Current = Current.Next;

                Count++;

            }

            T ValueToDel = Current.Data;

            //是否是头结点

            if (Count == 0)

            {

                Head = Current.Next;

            }

            //是否是普通的结点

            if (Count != 0 && Current.Next != null)

            {

                Previous.Next = Current.Next;

            }

            //是否是最后一个结点

            if (Count != 0 && Current.Next == null)

            {

                Previous.Next = null;

            }

 

            //删除结点

            states = States.Success;

            return ValueToDel;

        }

 

        public T GetElem(int i)

        {

            if (< 0 || i >= this.GetLength())

            {

                return default(T);

            }

            if (IsEmpty() == true)

            {

                return default(T);

            }

 

            Node<T> Last = Head;

            int Count = 0;

            while (Count != i && Last.Next != null)

            {

                Last = Last.Next;

                Count++;

            }

            return Last.Data;

        }

 

        public int GetLength()

        {

            if (Head==null)

            {

                return 0;

            }

            Node<T> Last;

            Last = Head;

            int Count=0;

            while (Last.Next!=null)

            {

                Last = Last.Next;

                Count++;

            }

            return ++Count;

            //throw new NotImplementedException();

        }

 

        public States Insert(T item, int index)

        {

            bool isIndexTrue = index < 0 || index > this.GetLength();

            if (isIndexTrue)

            {

               return  States.Fail;

               

            }

            //如果链表为空

            if (IsEmpty() == true )

            {

                Head.Data = item;

            }

            //如果是第一个结点

            if (index==0)

            {

                Node<T> node = new Node<T>(item);

                node.Next = Head;

                Head = node;

            }

            //如果是普通的结点

            Node<T> Previous = Head;

          //  Node<T> Previous = Head;

            int Count = 0;

            while (Count != index-&& Previous.Next != null)

            {

            //    Previous = Current;

                Previous = Previous.Next;

                Count++;

            }

            if (Count == index-1)

            {

                Node<T> node=new Node<T>(item);

                node.Next = Previous.Next;

                Previous.Next = node;

            }

            //如果是最后一个结点

            if (this.GetLength()==index)

            {

                Previous.Next = new Node<T>(item);

            }

            return States.Success;

        }

 

        public bool IsEmpty()

        {

            return Head == null ? true : false;

        }

 

        public int Locate(T value, out States states)

        {

            if (IsEmpty() == true)

            {

                states = States.Fail;

                return 0;

            }

 

            Node<T> Last = Head;

            int Count = 0;

            while (Last.Next != null &&( !value.Equals(Last.Data)))

            {

                Last = Last.Next;

                Count++;

            }

            states = States.Success;

            return Count;

        }

    }

}

 

作者:kissazi2 
出处:http://www.cnblogs.com/kissazi2/ 
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

转载:http://www.cnblogs.com/kissazi2/p/3193957.html

时间: 2024-08-03 21:58:32

单链表的实现的相关文章

数据结构模版----单链表实现方式总结

数据结构模版----单链表实现方式总结 前面我们提供了四种方式实现的单链表,有带头结点的不带头结点的,而单链表的结构体定义也有两种方式,那么这些实现方式,到底有什么区别呢,为什么会出现这么多种实现方式呢,下面我们就来细细体会 一 单链表结构体的实现区别 首先我们对比一下,单链表结构体 不同方式的单链表实现时,链表结点的实现是相同的,不同之处在于单链表结构体的实现上 单链表结构体的实现 [cpp] view plain copy print? typedef int ElemType;      

单链表的顺序-c++正序与逆序创建单链表有什么区别

问题描述 c++正序与逆序创建单链表有什么区别 c++正序与逆序创建单链表有什么本质的区别,逆序比顺序的优点体现在哪? 解决方案 逆序没什么特别的好处,给你学编程的时候练练手玩的,在实际的项目中会用到标准库,那是双向链表,没有逆序创建一说. 要说逆序的好处:当要加入新的数据时,不需要遍历链表,可以直接在头结点之后插入即可,减少时间复杂度 解决方案二: 没有太大价值吧......不过双向的链表应用很广泛 解决方案三: 逆序创建单链表

java单链表常用操作

总结提高,与君共勉 概述. 数据结构与算法亘古不变的主题,链表也是面试常考的问题,特别是手写代码常常出现,将从以下方面做个小结 [链表个数] [反转链表-循环] [反转链表-递归] [查找链表倒数第K个节点] [查找链表中间节点] [判断链表是否有环] [从尾到头打印单链表-递归] [从尾到头打印单链表-栈] [由小到大合并有序单链表-循环] [由小到大合并有序单链表-递归] 通常在Java中这样定义单链表结构 [java] view plain copy <span style="fon

用java学习数据结构--单链表

数据|数据结构 /* * Created on 2004-9-10 * * 单链表中的结点类型声明. */package org.arliang;/** * @author 李梁 * * 单链表中的结点. */public class node{ private int data; //存放数据 private node link; //链接的下一个接点. public static void main(String[]args) { } /** * @return Returns the da

数据结构(C#):单链表

与顺序表相比,链表有自己的特点:插入.删除操作无需移动元素:能够高效实现动态内存分配:但 不能按节点索引快速定位到节点:由于需要记录指针域,系统开销较大. 本篇介绍单链表的实现,使用上一篇定义的接口. 代码: /* * File : SingleLinkedList.cs * Author : Zhenxing Zhou * Date : 2008-12-06 * Blog : http://www.xianfen.net/ */ using System; using System.Colle

大话数据结构二:线性表的链式存储结构(单链表)

1. 线性表的链式存储结构:指的是用一组任意的存储单元存储线性表的数据元素,这组存储单元可以是连续的,也可以是不连续的,这就意味着这些数据元素可以存在内存未被占用的任意位置. 2. 结点:结点由存放数据元素的数据域和存放后继结点地址的指针域组成. 1.)顺序存储结构中,每个数据元素只需要存数据元素的信息就可以了. 2.)链式存储结构中,除了要存储数据元素信息外,还要存储它的后继元素的存储地址. 3.)链表中第一个结点叫头结点,它的存储位置叫做头指针,它的数据域可以不存储任何信息,链表的最后一个结

单链表相关算法

[1]打印单链表,void PrintList(List list); 使用一个指针遍历所有链表节点. [2]两个升序链表,打印tarList中的相应元素,这些元素的序号由SeqList指 定,void PrintLots(List tarList, List seqList); 使用两个指针分别遍历两个链表,每次取出序列链表的一个序号后,根据该 序号,到达目标链表指定节点. [3]两个升序链表交集 ,List Intersect(List l1, List l2); [4]两个升序链表并集 ,

数据结构学习(C++)之单链表

节点类 #ifndef Node_H#define Node_Htemplate <class Type> class Node //单链节点类{ public: Type data; Node<Type> *link; Node() : data(Type()), link(NULL) {} Node(const Type &item) : data(item), link(NULL) {} Node(const Type &item, Node<Type&

数据结构的C++实现之线性表之链式存储结构以及单链表反转

为了表示每个数据元素ai与其直接后继元素ai+1之间的逻辑关系,对数据ai,除了存储其自身的信息之外,还需存储一 个指示其直接后继的信息(即直接后继的存储位置).这两部分信息组成数据元素ai的存储映像,称为结点(Node).N个 结点链结成一个链表,即为线性表(a1,a2,...,an)的链式存储结构,因为此链表的每个节点中只包含一个指针域,所以叫 做单链表. 我们把链表中的第一个结点的存储位置叫做头指针,,为了更方便地对链表进行操作,如删除第一个结 点的特殊情况(第一个结点没有前驱,而要摘除一