C#单向链表实现非升序插入方法的实例详解

 更新时间:2024年03月01日 11:42:47   作者:wenchm  
单向链表是一种数据结构,其中元素以线性方式连接在一起,每个元素都指向下一个元素,非升序插入意味着元素不是按升序(从小到大)插入链表中,本文给大家介绍了C#单向链表实现非升序插入方法的实例,需要的朋友可以参考下

一、涉及到的知识点

1.非升序插入的定义

单向链表是一种数据结构,其中元素以线性方式连接在一起,每个元素都指向下一个元素。非升序插入意味着元素不是按升序(从小到大)插入链表中。相反,元素可以以任何顺序插入链表中,这取决于应用程序的需要。 

2. 非升序插入不是随机插入

在 C# 单向链表中,非升序插入并不意味着随机插入。它意味着根据节点数据的大小,在链表中的适当位置插入新节点,而不是简单地将其插入到链表的末尾。

当使用非升序插入时,新节点会根据其数据大小与现有节点进行比较,然后插入到链表中的正确位置。这意味着新节点的插入位置取决于其数据大小以及链表中现有节点的数据大小。

以下是 InsertUnAscending 方法的工作原理:

  • 如果链表为空,新节点将作为链表的头节点插入。
  • 如果链表不为空,将使用一个临时节点(temp)从头节点开始遍历链表。
  • 在遍历过程中,将比较新节点的数据与当前节点(temp)的下一个节点的数据大小。如果当前节点的下一个节点的数据小于新节点的数据,将移动到下一个节点。
  • 当找到适当的位置时,将新节点插入到当前节点(temp)的下一个节点之前,然后将新节点的下一个节点设置为当前节点的下一个节点的下一个节点。
  • 最后,将当前节点(temp)的下一个节点设置为新节点。

这种方法确保了链表中的节点数据保持非升序排列。

3.AddLast 方法

AddLast 方法是 C# 中 LinkedList<T> 类的一个方法,用于在链表的末尾添加一个元素。当想要将元素按任意顺序添加到链表中时,可以使用此方法。

以下是 AddLast 方法的语法:

public void AddLast(T value);

其中,T 是类型参数,表示链表中元素的类型。

二、实例

1.自定义单向链表及非升序插入方法

// 单向链表实现:非升序插入数据的方法
namespace _131_7
{
    public class Node
    {
        public int Data { get; set; }
        public Node? Next { get; set; }
    }
 
    public class LinkedList
    {
        private static Node? _head;
 
        public LinkedList()
        {
            _head = null;
        }
 
        /// <summary>
        /// 非升序插入节点数据的方法
        /// 非升序插入意味着元素不是按升序插入链表中
        /// 相反,元素可以以任何顺序插入链表中
        /// 具体实现是由程序的需求决定的
        /// </summary>
        public static void AddNonAscending(int data)
        {
            Node newNode = new() { Data = data };
            if (_head == null)
            {
                _head = newNode;
            }
            else
            {
                Node? temp = _head;
                while (temp.Next != null && temp.Next.Data < data)
                {
                    temp = temp.Next;
                }
                newNode.Next = temp.Next;
                temp.Next = newNode;
            }
        }
 
        // 遍历链表并打印数据
        public static void PrintList()
        {
            Node? temp = _head;
            while (temp != null)
            {
                Console.Write(temp.Data + " ");
                temp = temp.Next;
            }
            Console.WriteLine();
        }
    }
 
    class Program
    {
        static void Main(string[] args)
        {
            ArgumentNullException.ThrowIfNull(args);
 
            // 插入元素,顺序不是升序
            LinkedList.AddNonAscending(11);
            LinkedList.AddNonAscending(5);
            LinkedList.AddNonAscending(3);
            LinkedList.AddNonAscending(4);
            LinkedList.AddNonAscending(2);
            LinkedList.AddNonAscending(1);
            // 遍历链表并打印元素
            LinkedList.PrintList();
        }
    }
}
//运行结果:
/*
11 1 2 3 4 5
 */

2.用LinkedList<int>链表类AddLast方法实现非升序插入

// 用LinkedList<int>链表类AddLast方法实现非升序插入
namespace _131_8
{
    class Program
    {
        static void Main(string[] args)
        {
            ArgumentNullException.ThrowIfNull(args);
 
            LinkedList<int>? list = new();
            // 插入元素,顺序不是升序
            list.AddLast(5);
            list.AddLast(3);
            list.AddLast(1);
            list.AddLast(4);
            list.AddLast(2);
            // 遍历链表并打印元素
            LinkedListNode<int>? node = list.First;
            while (node != null)
            {
                Console.WriteLine(node.Value);
                node = node.Next;
            }
        }
    }
}
//运行结果:
/*
5
3
1
4
2
 */

从上面的示例中可以看到,元素不是按升序插入链表的。

到此这篇关于C#单向链表实现非升序插入方法的实例详解的文章就介绍到这了,更多相关C#单向链表非升序插入内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C#影院售票系统毕业设计(3)

    C#影院售票系统毕业设计(3)

    这篇文章介绍了C#影院售票系统毕业设计,文章主要内容是关于购票、座位颜色状态的改变及场次座位状态的显示,需要的朋友可以参考下
    2015-11-11
  • c#操作Redis的5种基本类型汇总

    c#操作Redis的5种基本类型汇总

    这篇文章主要给大家介绍了关于c#操作Redis的5种基本类型,文中通过示例代码介绍的非常详细,对大家的学习或者使用C#具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2020-07-07
  • C#调用usb摄像头的实现方法

    C#调用usb摄像头的实现方法

    这篇文章主要介绍了C#调用usb摄像头的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-02-02
  • c#高效的线程安全队列ConcurrentQueue<T>的实现

    c#高效的线程安全队列ConcurrentQueue<T>的实现

    这篇文章主要介绍了c#高效的线程安全队列ConcurrentQueue<T>的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • C#中增加SQLite事务操作支持与使用方法

    C#中增加SQLite事务操作支持与使用方法

    这篇文章主要介绍了C#中增加SQLite事务操作支持与使用方法,结合实例形式分析了C#中针对SQLite事务操作的添加及使用技巧,需要的朋友可以参考下
    2017-07-07
  • 使用C#开发ActiveX控件

    使用C#开发ActiveX控件

    activex控件以前也叫做ole控件,它是微软ie支持的一种软件组件或对象,可以将其插入到web页面中,实现在浏览器端执行动态程序功能,以增强浏览器端的动态处理能力。通常activex控件都是用c++或vb语言开发,本文介绍另一种方式,使用c#语言开发activex控件。
    2017-02-02
  • C#多线程爬虫抓取免费代理IP的示例代码

    C#多线程爬虫抓取免费代理IP的示例代码

    本篇文章主要介绍了C#多线程爬虫抓取免费代理IP的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • C# 减少嵌套循环的两种方法

    C# 减少嵌套循环的两种方法

    最近在解决性能优化的问题,看到了一堆嵌套循环,四五层级的循环真的有点过分了,在数据量成万,十万级别的时候,真的非常影响性能。本文介绍了C# 减少嵌套循环的两种方法,帮助各位选择适合自己的优化方案,优化程序性能
    2021-06-06
  • C#读写Excel的流程步骤

    C#读写Excel的流程步骤

    这篇文章主要介绍了详解C#读写Excel的流程步骤,文中通过示例代码介绍的非常详细,对大家的学习或工作有一定的参考学习价值,需要的朋友们下面随着小编来一起来学习吧
    2023-12-12
  • C#实现将数组内元素打乱顺序的方法

    C#实现将数组内元素打乱顺序的方法

    这篇文章主要介绍了C#实现将数组内元素打乱顺序的方法,涉及C#数组遍历及随机数操作的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-08-08

最新评论