zoukankan      html  css  js  c++  java
  • 6,泛型双向链表

    实现思路:

    1)同单向链表思路大致相同,只是多来一个pre指向上一节点

    2)双向链表删除节点时,不依赖前一节点,可以自我删除,判断如果是删除最后一个元素时直接断开即可

    c#代码实现:

      1 using System;
      2 using System.Collections.Generic;
      3 using System.Text;
      4 
      5 namespace 数据结构
      6 {
      7     public class DoubleLinked<T>
      8     {
      9         //头部节点
     10         public Node Header { get;} = new Node(0, default);
     11 
     12         //双链表节点
     13         public class Node
     14         {
     15             public int Index { get; set; }
     16             public T Value { get; set; }
     17             public Node Next { get; set; }
     18             public Node Pre { get; set; }
     19             public Node(int index, T value)
     20             {
     21                 this.Index = index;
     22                 this.Value = value;
     23             }
     24             //重写Tostring方法方便查看节点
     25             public override string ToString()
     26             {
     27                 return $"index={Index},value={Value}";
     28             }
     29         }
     30 
     31         //添加到链表末尾
     32         public void Append(Node node)
     33         {
     34             //辅助指针,指向头节点
     35             Node pointer = this.Header;
     36             //查找链表末尾
     37             while (pointer.Next != null)
     38             {
     39                 //指向下一节点
     40                 pointer = pointer.Next;
     41             }
     42             //添加到末尾
     43             pointer.Next = node;
     44             //指向上一节点,
     45             node.Pre = pointer;
     46         }
     47 
     48         //有序插入
     49         public void Insert(Node node)
     50         {
     51             Node pointer = this.Header;
     52             while (pointer.Next != null)
     53             {
     54                 if (node.Index < pointer.Next.Index)
     55                 {
     56                     //新指向下一节点
     57                     node.Next = pointer.Next;
     58                     //上节点指向新节点
     59                     pointer.Next = node;
     60                     //下一节点指向新节点
     61                     pointer.Next.Pre = node;
     62                     //新节点指向上一节点
     63                     node.Pre = pointer;
     64                     return;
     65                 }
     66                 else if (pointer.Next.Index == node.Index)
     67                 {
     68                     //如果等于下一个节点,节点以存在返回
     69                     Console.WriteLine($"节点{node.Index}已经存在");
     70                     return;
     71                 }
     72                 //没有合适插入位置,指向下一节点
     73                 pointer = pointer.Next;
     74             }
     75             //没找到插入位置,添加到末尾
     76             pointer.Next = node;
     77             node.Pre = pointer;
     78         }
     79 
     80         //删节点
     81         public void Remove(int index)
     82         {
     83             if (this.Header.Next == null)
     84             {
     85                 Console.WriteLine($"空链表");
     86                 return;
     87             }
     88             //辅助指针,指向头节点
     89             Node pointer = this.Header.Next;
     90             //双向链表节点可以自身删除,不用依赖前一节点
     91             while (pointer != null)
     92             {
     93                 if (pointer.Index == index)
     94                 {
     95                     //前一节点指到下一节点
     96                     pointer.Pre.Next = pointer.Next;
     97                     //如果不三节点最后,下一个节点要指向前一节点
     98                     if (pointer.Next != null)
     99                     {
    100                         //下一节点指到前一节点
    101                         pointer.Next.Pre = pointer.Pre;
    102                     }
    103                     return;
    104                 }
    105                 else
    106                 {
    107                     //没找到继续,指针指向下一节点
    108                     pointer = pointer.Next;
    109                 }
    110             }
    111             Console.WriteLine($"没找节点{index}");
    112         }
    113 
    114         //打印链表
    115         public void Scan()
    116         {
    117             Node pointer = this.Header;
    118             while (pointer.Next != null)
    119             {
    120                 Console.WriteLine(pointer.Next.ToString());
    121                 pointer = pointer.Next;
    122             }
    123         }
    124     }
    125 
    126     public class DoubleLinkedDemo
    127     {
    128         static void Main(string[] args)
    129         {
    130             Console.WriteLine("向链表添加三位骨架精奇同志");
    131             var doubleLinked = new DoubleLinked<string>();
    132             doubleLinked.Append(new DoubleLinked<string>.Node(2, "张三"));
    133             doubleLinked.Append(new DoubleLinked<string>.Node(5, "李四"));
    134             doubleLinked.Append(new DoubleLinked<string>.Node(4, "王五"));
    135             doubleLinked.Scan();
    136             //---------------------------------------------------
    137             Console.WriteLine("删除李四");
    138             doubleLinked.Remove(5);
    139             doubleLinked.Scan();
    140             Console.WriteLine("删除张三");
    141             doubleLinked.Remove(2);
    142             doubleLinked.Scan();
    143             Console.WriteLine("删除王五");
    144             doubleLinked.Remove(4);
    145             doubleLinked.Scan();
    146             //---------------------------------------------------
    147             Console.WriteLine("插入小明");
    148             doubleLinked.Insert(new DoubleLinked<string>.Node(4, "小明"));
    149             doubleLinked.Scan();
    150             Console.WriteLine("插入小李");
    151             doubleLinked.Insert(new DoubleLinked<string>.Node(1, "小李"));
    152             doubleLinked.Scan();
    153         }
    154     }
    155 }

     

  • 相关阅读:
    TypeScript 函数
    单链表 C++
    测试用例概念 原则
    TypeScript 类
    TypeScript 接口
    Cellection
    面向对象
    反射
    B树
    无权无向图
  • 原文地址:https://www.cnblogs.com/xiaojvhuang/p/12694544.html
Copyright © 2011-2022 走看看