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*

 */
相关推荐
qmx_0742 分钟前
HTB-Jerry(tomcat war文件、msfvenom)
java·web安全·网络安全·tomcat
为风而战1 小时前
IIS+Ngnix+Tomcat 部署网站 用IIS实现反向代理
java·tomcat
技术无疆3 小时前
快速开发与维护:探索 AndroidAnnotations
android·java·android studio·android-studio·androidx·代码注入
架构文摘JGWZ6 小时前
Java 23 的12 个新特性!!
java·开发语言·学习
Navigator_Z6 小时前
数据结构C //线性表(链表)ADT结构及相关函数
c语言·数据结构·算法·链表
拾光师7 小时前
spring获取当前request
java·后端·spring
aPurpleBerry7 小时前
neo4j安装启动教程+对应的jdk配置
java·neo4j
我是苏苏7 小时前
Web开发:ABP框架2——入门级别的增删改查Demo
java·开发语言
xujinwei_gingko7 小时前
Spring IOC容器Bean对象管理-Java Config方式
java·spring
2301_789985947 小时前
Java语言程序设计基础篇_编程练习题*18.29(某个目录下的文件数目)
java·开发语言·学习