单链表


1
2
3
4
5
6
7
8
单链表:从第一个节点连接到后一个节点,靠线连接,知道最后一个节点连接到null。
增加:往最后一个节点之后连接一个新的节点,这个节点后面为null
插入:分两种,1,插在头节点,就头节点往后移一位。2,插在中间,比如插在3,4中间,就在3.next为要插入的,然后插入的连接上4。
删除:把6号删除,就是6除去,5连接到7.
跟顺序表中一样先定义一个接口,把所有要实现的方法,放入,这里就不写了。
下面时方法的实现:
 class LinkList<T> : IListDS<T>
    {
        private Node<T> head;//定义一个头节点、

        public LinkList()
        {
            head = null;//置空
        }
        public T this[int index]
        {
            get
            {
                Node<T> temp = head;
                for (int i = 1; i <= index; i++)
                {
                    //temp往后移动到要插入的那个数前一位
                    temp = temp.Next;
                }
                return temp.Date;
            }
           
        }

        public void Add(T item)
        {
            Node<T> newNode = new Node<T>(item);//定义一个新的节点
            if(head == null)//为空,这个就是头节点
            {
                head = newNode;
            }
            else
            {
                //把新来的节点,放到最后面
                //要访问到尾节点
                Node<T> temp = head;
                //跳转到最后一个节点
                while (true)
                {
                    if(temp.Next != null)
                    {
                        temp = temp.Next;
                    }
                    else
                    {
                        break;
                    }
                }
                temp.Next = newNode;//把要添加的节点,放到最后一个的后面一个,也就是链表的尾部
            }
            
        }

        public void Clear()
        {
            head = null;
        }

        public T Delete(int index)
        {
            Node<T> temp = head;
            T date = default(T);//取得值,节点中的
            if (index == 0)
            {
                date = head.Date;
                temp = temp.Next;
            }
            else if (index > 0)
            {
                for (int i = 0; i < index; i++)//到要删除的下标的那个数的前一位
                {
                    temp = temp.Next;//temp往后移到要删除的哪一位的前一位
                }
                Node<T> preNode = temp;//删除的数的前一位
                Node<T> currentNode = temp.Next;
                Node<T> nextNode = temp.Next.Next;//删除的数的后一位
                preNode.Next = nextNode;//

                date = currentNode.Date;//删除的这个节点的数据
            }
            
            return date;
        }

        public T GetElem(int index)//获取元素
        {
            return this[index];
        }

        public int GetLength()
        {
            Node<T> temp = head;
            int count = 1;
            if (head == null)
                return 0;
            else
            {
                while (true)
                {
                    if(temp.Next != null)
                    {
                        count++;
                        temp = temp.Next;
                    }
                    else
                    {
                        break;
                    }
                }
                return count;

            }
          
        }

        public void Insert(T item, int index)
        {
            Node<T> newNode = new Node<T>(item);
           if(index == 0)
            {
                newNode.Next = head;//插入的节点的后一位
                head = newNode;
            }
            else
            {
                Node<T> temp = head;
                for (int i = 1; i <index; i++)
                {
                    //temp往后移动到要插入的那个数前一位
                    temp = temp.Next;
                }
                Node<T> proNode = temp;//要插入的数的前一位
                Node<T> currentNode = temp.Next;//要插入的那位书数
                proNode.Next = newNode;
                newNode.Next = currentNode;//前一位的节点到要插入的,要插入的到过去那个位置上的节点
            }
        }

        public bool IsEmpty()
        {
            return head == null;
        }

        public int Locate(T value)
        {
            Node<T> temp = head;
            if(temp == null)
            {
                return -1;//头节点为空
            }
            else
            {
                int index = 0;
                while (true)
                {
                    if(temp.Date.Equals(value))
                    {
                        return index;//当相等的时候返回这时候的index;
                    }
                    else
                    {
                        if(temp.Date != null)
                        {
                            temp = temp.Next;//往后移动
                            index++;
                        }
                        else
                        {
                            break;
                        }
                    }
                }
                return -1;//没有找到
            }
        }
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值