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*

 */
相关推荐
karry_k12 小时前
MyBatis批量insert-select踩坑:useGeneratedKeys=true 可能让PostgreSQL返回大量插入结果
java·后端
karry_k12 小时前
PostgreSQL 在 MyBatis 中执行正常 SQL 失效:一次 DELETE USING 踩坑记录
java·后端
SamDeepThinking16 小时前
从源码到代码:MyBatis-Flex 与 MyBatis-Plus 的逐项对比
java·后端·程序员
她的男孩19 小时前
Spring Boot 接 Flowable 工作流:用 3 个注解搭一个请假审批流程
java·后端·架构
荣码20 小时前
LLM结构化输出:让AI返回JSON而不是废话,我踩了4个坑
java·python
plainGeekDev1 天前
Gson → kotlinx.serialization
android·java·kotlin
小bo波1 天前
Java Swing 图形用户界面实验 —— 从算术练习到游戏开发的完整实践
java·课程设计·gui·游戏开发·扫雷·swing
咖啡八杯1 天前
GoF设计模式——备忘录模式
java·后端·spring·设计模式