/// <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++; }
/// <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++; }
public DoubleLinkListNode(DoubleLinkListNode <T> prev, DoubleLinkListNode <T> next) { Prev = prev; Next = next; }
public DoubleLinkListNode(T data, DoubleLinkListNode <T> prev, DoubleLinkListNode <T> next) { Data = data; Prev = prev; Next = next; }