• 单链表的实现


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

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

            }

        }

    }

     

  • 相关阅读:
    Styles和Themes
    Activity返回值
    Android BaseAdapter 例子
    Android流量统计TrafficStats类的使用
    Javascript屏蔽IE和Firefox浏览器默认按键响应(快捷键功能)
    拍照技巧笔记
    android开发录音和播放录音的例子
    Eclipse快捷键大全(android开发)
    Android SQLite 添加、更新和删除行
    绑定Enum到ASP.NET数据绑定控件的完美解决方案[05/26修订]——增加支持第三方枚举描述,支持二进制与过的枚举值
  • 原文地址:https://www.cnblogs.com/kissazi2/p/3193957.html
Copyright © 2020-2023  润新知