C#双向链表实现:在当前节点后插入新数据的方法Insert()

目录

1.定义一个泛型节点类并自动属性

[2.定义链表类,并实现Append、Print、MoveFirst、 Insert](#2.定义链表类,并实现Append、Print、MoveFirst、 Insert)

3.Main方法


1.定义一个泛型节点类并自动属性

cs 复制代码
/// <summary>
/// 定义泛型节点类
/// </summary>
/// <typeparam name="T">泛型运算符</typeparam>
/// <param name="value">泛型参数</param>
public class ListNode<T>(T value)
{
    public T Object { get; set; } = value;
    public ListNode<T>? Next { get; set; }
    public ListNode<T>? Previous { get; set; }
}

2.定义链表类,并实现Append、Print、MoveFirst、 Insert

cs 复制代码
/// <summary>
/// 定义链表类
/// </summary>
public class LinkedList
{
    private ListNode<int>? _head;
    private ListNode<int>? _tail;
    private ListNode<int>? _current;

    public ListNode<int>? Current { get => _current; set => _current = value; }

    /// <summary>
    /// 追加节点到Append方法
    /// </summary>
    /// <param name="value"></param>
    public void Append(int value)
    {
        var newNode = new ListNode<int>(value);
        if (_head == null)
        {
            _head = newNode;
            _tail = newNode;
        }
        else
        {
            _tail!.Next = newNode;
            newNode.Previous = _tail;
            _tail = newNode;
        }
    }

    /// <summary>
    /// 输出各节点
    /// </summary>
    public void Print()
    {
        var current = _head;
        while (current != null)
        {
            Console.WriteLine(current.Object);
            current = current.Next;
        }
    }

    /// <summary>
    ///移动指针到链表头
    /// </summary>
    public void MoveFirst()
    {
        if (_head != null)
        {
            _current = _head;
        }
    }

    /// <summary>
    /// 在当前节点后面插入新数据
    /// </summary>
    /// <param name="value">待插入的数据</param>
    public void Insert(int value)
    {
        // 创建一个新的节点
        var newNode = new ListNode<int>(value);

        // 如果链表为空,将新节点设置为头节点
        if (_head == null)
        {
            _head = newNode;
            _current = newNode;
            return;
        }

        // 找到当前节点
        var current = _current;
        if (current == null)
        {
            //current = _head;
            _current = _head;
            while (_current.Next != null)
            {
                _current = _current.Next;
            }
            current = _current;
        }

        // 在当前位置插入新节点
        newNode.Next = current.Next;
        newNode.Previous = current;
        current.Next = newNode;
        _current = newNode;
    }

3.Main方法

cs 复制代码
 class Program
 {
     static void Main(string[] args)
     {
         ArgumentNullException.ThrowIfNull(args);

         var linkedList = new LinkedList();
         linkedList.Append(5);
         linkedList.Append(2);
         linkedList.Append(8);
         linkedList.Append(1);
         linkedList.Print();
         Console.WriteLine("*初始化数据*");

         linkedList.MoveFirst();
         linkedList.Insert(3);
         linkedList.Print();
         Console.WriteLine("*头结点后插入3*");
     }
 }

运行结果:

cs 复制代码
//运行结果:
/*
5
2
8
1
*初始化数据*
5
3
2
8
1
*头结点后插入3*

 */
相关推荐
水痕0144 分钟前
gin结合minio来做文件存储
java·eureka·gin
唐青枫1 小时前
别滥用 Task.Run:C# 异步并发实操指南
c#·.net
寒士obj1 小时前
Spring事物
java·spring
柯南二号2 小时前
【Java后端】Spring Boot 集成 MyBatis-Plus 全攻略
java·spring boot·mybatis
我好喜欢你~8 小时前
C#---StopWatch类
开发语言·c#
桦说编程9 小时前
Java 中如何创建不可变类型
java·后端·函数式编程
lifallen9 小时前
Java Stream sort算子实现:SortedOps
java·开发语言
IT毕设实战小研9 小时前
基于Spring Boot 4s店车辆管理系统 租车管理系统 停车位管理系统 智慧车辆管理系统
java·开发语言·spring boot·后端·spring·毕业设计·课程设计
没有bug.的程序员10 小时前
JVM 总览与运行原理:深入Java虚拟机的核心引擎
java·jvm·python·虚拟机
甄超锋10 小时前
Java ArrayList的介绍及用法
java·windows·spring boot·python·spring·spring cloud·tomcat