单链表的实现

简介:

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

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

目录
相关文章
|
6月前
|
存储
【单链表】
【单链表】
35 0
|
1月前
|
存储 C语言
单链表详解
单链表详解
33 0
|
3月前
|
存储 缓存
详解单链表
详解单链表
37 0
详解单链表
|
4月前
单链表的实现
单链表的实现
|
10月前
|
存储
【链表】单链表的实现
【链表】单链表的实现
44 0
|
10月前
|
存储 编译器
【链表之单链表】
什么是链表 概念:链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的 。 通俗地讲,就是一个结构体有两个成员,一个是存放数据的成员,一个是指针成员,通常的单链表是第一个节点的指针成员存着下一个节点的地址,下一个节点的指针成员又存下一个节点的地址,这样每个节点之间连接起来,就叫做链表。 本文主要讲的是链表中的一种重要的形式:单链表。
|
11月前
|
存储
单链表
单链表
|
存储 API 索引
链表——单链表
单向链表是链表的一种,它由多个结点组成,每个结点都由一个数据域和一个指针域组成,数据域用来存储数据,指针域用来指向其后继结点。链表的头结点的数据域不存储数据,指针域指向第一个真正存储数据的结点。
71 0
链表——单链表