C#单向链表实现:对链表初始数据进行冒泡排序的方法

目录

一、涉及到的知识点

1.冒泡排序

2.什么时候需要对链表数据排序

二、对链表初始数据冒泡排序算法实现

1.首先,检查输入的链表头节点head是否为空或者只有一个节点

2.接下来,进入一个do-while循环

3.在每次循环中,首先将当前节点current初始化为链表头节点

4.在内部while循环中

[5. 在内部while循环结束后](#5. 在内部while循环结束后)

6.当外部do-while循环结束时

三、完整的实例


一、涉及到的知识点

1.冒泡排序

冒泡排序(Bubble Sort)是一种简单的排序算法。它重复地遍历待排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。遍历数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。

以下是冒泡排序算法的实现过程:

  1. 比较相邻的元素。如果第一个比第二个大(升序),就交换它们两个。
  2. 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。
  3. 针对所有的元素重复以上的步骤,除了最后一个。
  4. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

在实现冒泡排序算法的过程中,通常使用嵌套循环来完成。外层循环负责控制遍历的次数,内层循环负责比较相邻元素并进行交换。在每一轮遍历过程中,最大的元素会逐渐"冒泡"到数列的最后。当所有元素都排序完毕后,算法结束。

2.什么时候需要对链表数据排序

  • 主观上需要对链表的数据进行排序的时候;
  • 必须先对链表数据执行排序操作,才能有效地执行其它方法,比如升序插入操作之前就需要对已有的链表数据进行排序操作。

二、对链表初始数据冒泡排序算法实现

使用了C#实现了一个冒泡排序算法,用于对链表中的节点进行排序。下面结合源码详细介绍一下冒泡排序算法的实现过程:

1.首先,检查输入的链表头节点head是否为空或者只有一个节点

如果是,那么这个链表已经排序完毕,直接返回head。

cs 复制代码
if (head == null || head.Next == null)
{
    return head;
}

2.接下来,进入一个do-while循环

这个循环会一直执行到没有节点需要交换为止。变量swapped用于标记在当前循环中是否发生了节点值的交换。

cs 复制代码
bool swapped;
do
{
    swapped = false;

3.在每次循环中,首先将当前节点current初始化为链表头节点

然后在current不为null且current的下一个节点也不为null的情况下,进入一个while循环。

cs 复制代码
ListNode? current = head;
while (current != null && current.Next != null)

4.在内部while循环中

如果当前节点current的值大于下一个节点的值,那么就交换这两个节点的值,并将变量swapped设置为true,表示发生了交换。

cs 复制代码
if (current.Next.Value < current.Value)
{
    int temp = current.Value;
    current.Value = current.Next.Value;
    current.Next.Value = temp;
    swapped = true;
}

5. 在内部while循环结束后

将current向后移动一位,以便在下一次循环中比较下一个节点。

cs 复制代码
current = current.Next;

6.当外部do-while循环结束时

说明链表中的节点已经按照升序排序完毕,返回排序后的链表头节点head。

cs 复制代码
} while (swapped);

return head;

这段程序通过双重循环实现了冒泡排序算法,外部do-while循环负责控制排序的次数,内部while循环负责比较相邻节点并进行交换。在每一轮遍历过程中,最大的节点会逐渐"冒泡"到链表的最后。当所有节点都排序完毕后,算法结束。

三、完整的实例

cs 复制代码
// 对链表初始数据进行冒泡排序并输出
namespace _131_6
{
    public class ListNode(int value)
    {
        public int Value { get; set; } = value;
        public ListNode? Next { get; set; }
    }

    class Program
    {
        public static void PrintList(ListNode? head)
        {
            ListNode? current = head;
            while (current != null)
            {
                Console.Write(current.Value + " ");
                current = current.Next;
            }
            Console.WriteLine();
        }

        /// <summary>
        /// 对链表数据冒泡排序
        /// </summary>
        public static ListNode? SortList(ListNode? head)
        {
            if (head == null || head.Next == null)
            {
                return head;
            }

            bool swapped;
            do
            {
                swapped = false;
                ListNode? current = head;
                while (current != null && current.Next != null)
                {
                    if (current.Next.Value < current.Value)
                    {
                        (current.Next.Value, current.Value) = (current.Value, current.Next.Value);
                        swapped = true;
                    }
                    current = current.Next;
                }
            } while (swapped);

            return head;
        }

        static void Main(string[] args)
        {
            ArgumentNullException.ThrowIfNull(args);

            ListNode? head = new(5)
            {
                Next = new ListNode(2)
            };
            head.Next.Next = new ListNode(8)
            {
                Next = new ListNode(1)
            };
            PrintList(head);
            Console.WriteLine("********");

            // 对初始链表进行排序
            head = SortList(head);
            PrintList(head);
        }
    }
}
//运行结果:
/*
5 2 8 1
********
1 2 5 8

 */
相关推荐
kyle~27 分钟前
C/C++字面量
java·c语言·c++
neoooo35 分钟前
别慌,Java只有值传递——一次搞懂“为啥我改了它还不变”!
java·后端·spring
秋难降36 分钟前
Python 知识 “八股”:给有 C 和 Java 基础的你😁😁😁
java·python·c
wuxuanok38 分钟前
Web后端开发-请求响应
java·开发语言·笔记·学习
livemetee1 小时前
spring-ai 1.0.0 (3)交互增强:Advisor 顾问模块
java
DDDDDouble1 小时前
<二>Sping-AI alibaba 入门-记忆聊天及持久化
java·人工智能
木叶丸1 小时前
编程开发中,那些你必须掌握的基本概念
前端·数据结构·编程语言
一切顺势而行1 小时前
kafka总结
java
Y1nhl1 小时前
力扣_链表_python版本
开发语言·python·算法·leetcode·链表·职场和发展
yanjiaweiya2 小时前
云原生-集群管理
java·开发语言·云原生