双向链表与单链表的区别

  1. 单链表查找的方向只能是一个方向,而双向链表可以向前或者向后查找
  2. 单链表不能自我删除,需要靠被删除节点的前一个节点删除,而双向链表可以自我删除
  3. 双向链表比单链表更占用空间,因为多了一个pre指针

    结构

image.png

双向链表的节点

  1. //链表的节点
  2. public class LinkNode2
  3. {
  4. #region 数据域
  5. public int index;
  6. public string str;
  7. #endregion
  8. #region 指针域
  9. public LinkNode2 pre;//上一个节点
  10. public LinkNode2 next;//下一个节点
  11. #endregion
  12. //创建这个节点时,存如数据
  13. public LinkNode2(int index, string str)
  14. {
  15. this.index = index;
  16. this.str = str;
  17. }
  18. }

双向链表对象类

  1. public class DoubleLinkList
  2. {
  3. public LinkNode2 head = new LinkNode2(0, "");
  4. //显示链表数据
  5. public void show()
  6. {
  7. LinkNode2 temp = head.next;
  8. while (temp != null)
  9. {
  10. Console.WriteLine(temp.index+temp.str);
  11. temp = temp.next;
  12. }
  13. }
  14. //1.添加节点到尾部
  15. //2.插入节点
  16. //3.删除节点
  17. }

1.添加节点到尾部

DoubleLinkList类里面的方法
image.png

  1. //添加到双链表的末尾
  2. public void AddLast(LinkNode2 newnode)
  3. {
  4. LinkNode2 temp = head;
  5. while (true)
  6. {
  7. if(temp.next==null)
  8. {
  9. temp.next = newnode;
  10. newnode.pre = temp;
  11. break;
  12. }
  13. temp = temp.next;
  14. }
  15. }

2.插入节点

DoubleLinkList类里面的方法
image.png

  1. //按照编号的顺序升序添加,(重复的也可以添加)
  2. public void AddOrder(LinkNode2 newnode)
  3. {
  4. LinkNode2 temp = head;
  5. while (true)
  6. {
  7. if (temp.next == null)
  8. {
  9. temp.next = newnode;
  10. newnode.pre = temp;
  11. break;
  12. }
  13. if (temp.next.index >= newnode.index)//这是升序
  14. {
  15. //看图,就能明白
  16. newnode.next = temp.next;
  17. temp.next.pre = newnode;
  18. temp.next = newnode;
  19. newnode.pre = temp;
  20. break;
  21. }
  22. temp = temp.next;
  23. }
  24. }

3.删除节点

DoubleLinkList类里面的方法
image.png

  1. //根据index删除节点
  2. public void Delete(int index)
  3. {
  4. LinkNode2 temp = head.next;
  5. while (true)
  6. {
  7. if (temp == null)
  8. {
  9. Console.WriteLine("没有这个数据");
  10. break;
  11. }
  12. if (temp.index == index)//找到了这个数据
  13. {
  14. temp.pre.next = temp.next;
  15. if(temp.next!=null)//不是最后一个节点才给下一个节点的pre引用,不然temp.next==null,temp.next.pre要空指针
  16. temp.next.pre = temp.pre;
  17. break;
  18. }
  19. temp = temp.next;
  20. }
  21. }