예제 #1
0
        /// <summary>
        /// 追加一个元素
        /// </summary>
        /// <param name="data"></param>
        public void Add(T data)
        {
            var newNode = new DoubleLinkListNode <T>(data);

            // Length为0,代表当前链表是空的
            // 直接把新节点作为尾节点,并将尾节点的下一个节点指向自己
            if (Length == 0)
            {
                Head      = newNode;
                Head.Prev = Head;
                Head.Next = Head;
                Length++;
                return;
            }

            // 尾节点
            var rear = Head.Prev;

            // 将当前节点作为尾节点的下一个节点
            rear.Next = newNode;

            // 将尾节点作为新节点的上一个节点
            newNode.Prev = rear;
            // 将头节点作为新节点的下一个节点
            newNode.Next = Head;

            // 将新节点作为头节点的上一个节点(新的尾节点)
            Head.Prev = newNode;

            Length++;
        }
예제 #2
0
        /// <summary>
        /// 插入
        /// </summary>
        /// <param name="index"></param>
        /// <param name="item"></param>
        public void Insert(int index, T item)
        {
            // index溢出
            if (index < 0 || index > Length - 1)
            {
                return;
            }

            // index为0,代表要插入头部
            if (index == 0)
            {
                // 创建新节点
                // 新节点的上一个节点为尾节点(Head.Prev)
                // 新节点的下一个节点为当前的头节点(Head)
                var newHead = new DoubleLinkListNode <T>(item, Head.Prev, Head);

                // 设置尾节点的下一个节点为新节点
                Head.Prev.Next = newHead;
                // 设置当前的头节点的上一个节点为新节点
                Head.Prev = newHead;

                // 将新节点设置为新的头节点
                Head = newHead;
                Length++;
                return;
            }

            // 找到前继节点
            int prevIndex = index - 1;
            var prevNode  = Get(prevIndex);

            if (prevNode == null)
            {
                return;
            }

            // 创建新节点
            // 新节点的上一个节点为当前节点上一个节点
            // 新节点的下一个节点为当前节点
            var newNode = new DoubleLinkListNode <T>(item, prevNode, prevNode.Next);

            // 设置当前节点(prevNode.Next)的上一个节点为新节点
            prevNode.Next.Prev = newNode;
            // 设置当前节点上一个节点的下一个节点为新节点(新节点替代当前节点)
            prevNode.Next = newNode;

            Length++;
        }
예제 #3
0
 public DoubleLinkListNode(DoubleLinkListNode <T> prev, DoubleLinkListNode <T> next)
 {
     Prev = prev;
     Next = next;
 }
예제 #4
0
 public DoubleLinkListNode(T data, DoubleLinkListNode <T> prev, DoubleLinkListNode <T> next)
 {
     Data = data;
     Prev = prev;
     Next = next;
 }