Insertion Sort List 链表插入排序@LeetCode

单链表求解 小白请教数据结构单链表问题 大二刚从电气转到计算机,在学习单链表的时候想着撸一遍书上单链表的源码,然后简单测试一下, 但是出现了问题,希望各位大佬能帮我看看 源码如下 类: template < typename T > struct LinkList // 单链表结点类型(用结构体) { T data; // 存放数据元素 LinkList <T> * next; //指向下一个节点的域 // 注意,这个不是动作,而是一个单纯的指针区域 }; template&l 阅读详情

原理很简单,就是插入排序,只是由于链表的性质所以必须从前向后查找该插入的位置。

但是很容易有各种小bug,一遍能做到bug-free有难度。


package Level4;

import Utility.ListNode;

/**
 * Insertion Sort List 
 * 
 *  Sort a linked list using insertion sort.
 *
 */
public class S135 {

	public static void main(String[] args) {
		ListNode head = new ListNode(4);
		ListNode n2 = new ListNode(2);
		ListNode n3 = new ListNode(1);
		ListNode n4 = new ListNode(3);
		ListNode n5 = new ListNode(1);
		head.next = n2;
		n2.next = n3;
		n3.next = n4;
//		n4.next = n5;
//		ListNode ret = insertionSortList(head);
//		ret.print();
		
		int[] list = {-84,142,41,-17,-71,170,186,183,-21,-76,76,10,29,81,112,-39,-6,-43,58,41,111,33,69,97,-38,82,-44,-7,99,135,42,150,149,-21,-30,164,153,92,180,-61,99,-81,147,109,34,98,14,178,105,5,43,46,40,-37,23,16,123,-53,34,192,-73,94,39,96,115,88,-31,-96,106,131,64,189,-91,-34,-56,-22,105,104,22,-31,-43,90,96,65,-85,184,85,90,118,152,-31,161,22,104,-85,160,120,-31,144,115};
//		int[] list = {1,0,2,1};
//		int[] list = {1,2,-1,0};
		ListNode dum = ListNode.create(list);
//		dum.print();
		
		ListNode ret = insertionSortList(dum);
		ret.print();
	}
	
	public static ListNode insertionSortList(ListNode head) {
        if(head==null || head.next==null){
        	return head;
        }
        
        ListNode p = head;		// 前后两个指针
        ListNode q = head.next;
        
        while(p!=null && q!=null){
        	if(p.val <= q.val){	// 递增顺序,无需交换,继续往前寻找
        		p = q;
        		q = q.next;
        	}else{			// out of order!
        		ListNode h = head;
        		if(head.val >= q.val){		// q元素比head元素还小的情况
        			ListNode qnext = q.next;
        			p.next = qnext;
        			q.next = head;
        			head = q;		// 更新链表头
        			q = qnext;		// 更新q的位置,让q继续往前寻找
        		}else{
        			while(h.val<=q.val && h.next.val<=q.val){	// 从head开始找,查找哪里适合放置q元素,注意元素相等的情况!
        				h = h.next;
        			}
        			if(h.val<=q.val && q.val<=h.next.val){		// 把q元素插入适当的地方
        				ListNode qnext = q.next;
        				p.next = qnext;
        				q.next = h.next;
        				h.next = q;
        				q = qnext;		// 更新q的位置,让q继续往前寻找
        			}
        		}
        	}
        }
        
        return head;
    }
}


下面是一种简单得多的方法:建立dummy节点,然后从dummy节点出发,构建有序链表,即现在有两个链表:一个是以head为头的无序链表,另一个是以dummy为头的有序链表。过程就是每次从头遍历有序链表,找到下一个适合无序链表头插入的地方。最终所有的无序链表都转移到了有序链表。

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */
public class Solution {
    public ListNode insertionSortList(ListNode head) {
        ListNode dummy = new ListNode(0); // From dummy node, we will create a sorted linkedlist
        
        ListNode cur = head;
        while(cur != null) {
            ListNode pre = dummy;   // pre is used to find the place to insert
            while(pre.next!=null && cur.val>pre.next.val) { // find the element which small enough to be inserted
                pre = pre.next;
            }
            ListNode next = cur.next;   // unlink from unorder linkedlist and link to order linkedlist
            cur.next = pre.next;
            pre.next = cur;
            cur = next;
        }
        return dummy.next;
    }
}






6-4 单链表插入排序 (15分) 6-4单链表插入排序(15分) 单链表插入排序 ###目的: 掌握单链表的应用和插入排序的思想。 ###内容: 编写一个函数insertion_sort,对一个无序单链表采用插入排序的方式,将其按递增方式排序,构成有序单链表。系统后台已经给出函数CreateListR和DispList的实现,只需实现函数insertion_sort即可。 ###单链表结点类型定义: typedef int ElemType; //元素的数据类型 typedef struct LNode { El.. 阅读详情

相关推荐

通过两个mark点确定某一个点的位置

read_image (Image0, '0.bmp') binary_threshold (Image0, Region, 'max_separability', 'dark', UsedThreshold) connection (Region, ConnectedRegions) fill_up (ConnectedRegions, RegionFillUp) select_shape_std (RegionFillUp, SelectedRegions, 'max_area', 70) red...

优快云博客 3889

单链表 -- 直接插入排序

单链表 – 直接插入排序 直接插入排序就是: 先从待排序的元素中取出第一个元素。 取出的这个第一个元素当作有序区的第一个元素。 接着从待排序的元素中取出第二个元素。 然后将第二个元素插入到有序区中的合适位置,也就是,将第二个元素与第一个元素比较,谁小谁就排在有序区的前面。 接着,在待排序的元素中取第三个元素,然后再在有序区中比较,直至取遍所有待排序的元素。 例题 有一个带头节点的...

vv_017的博客 2万+

Claude code-review 插件深度解析:AI 驱动的智能代码审查系统

Claude Code Review 插件深度解析:AI 驱动的智能代码审查系统 该插件通过多 Agent 并行工作方式自动审查 PR,采用置信度评分机制(80+分保留)过滤误报,确保高质量反馈。核心功能包括: 5个专业化 Agent 并行审查(规范合规性、bug检测、历史分析等) 8步工作流程:从资格检查到 GitHub 评论发布 创新性置信度评分系统(0-100分),严格过滤7类误报 结合 CLAUDE.md 规范和历史 PR 评论实现一致性审查 技术亮点: 多 Agent 架构(Haiku/Sonne

虚心若愚 2266

Insertion_Sort插入排序

1.算法步骤 第一个数前边没有数字,不用排,相当于已经排好序了,然后第二个数插进前边,第三个数在插进前边,如果待插入的元素与有序数列里相等,则插到那个数的后面 2.相关概念 时间复杂度: 最好是o(n), 最坏的是o(n的平方) 空间复杂度:o(1) 稳定性:稳定 3.C中的代码实现,注释有讲解 void insertionsort(int arr[],int len) { int i=0; int j=0; int temp=0; //定义两个针头 for(i=0;i<len;i++)

qq_33833430的博客 279

跨阻放大器(TIA)的输入输出阻抗的定义、分析和影响因素

跨阻放大器(Transimpedance Amplifier,简称TIA)是一种常用于将电流信号转换为电压信号的放大器。在TIA电路中,输入阻抗是指输入端对电流信号的响应能力,输出阻抗是指输出端对负载电阻的驱动能力。本文将分别介绍TIA的输入和输出阻抗的定义、分析以及影响因素。

weixin_44378594的博客 1万+

【即插即用模块】Transformer篇 | ICCV 2025 | MALA :注意力分布神似Softmax,告别线性注意力性能短板!

MALA(Magnitude-Aware Linear Attention)是一种改进的线性注意力机制,通过引入缩放因子和偏移项,解决了传统线性注意力忽视查询幅度的问题,使其分布更接近Softmax Attention。该模块具有线性复杂度(O(n)),结合RoPE和LEPE编码实现全局-局部位置信息混合,通过z值调制平衡信息权重。实验表明MALA在轻量级视觉任务中能有效平衡效率与精度,注意力可视化显示其分布与Softmax Attention高度相似。代码提供完整的RoPE位置编码和线性注意力

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 1108

简单C排序算法系列——Insertion Sort插入排序

构建排序序列,从后向前扫描排序,找到相应位置插入。

weixin_42491720的博客 623

PCL点云算法与项目实战案例汇总(长期更新)

本专栏将深入探讨PCL(点云库)的基础算法,旨在帮助读者掌握点云处理的核心技术。内容涵盖点云的采样、过滤、配准、分割等基础操作,并结合实际案例,展示这些算法在工程中的应用。无论你是初学者还是有一定经验的开发者,都能通过本专栏加深对PCL的理解,提升在三维数据处理领域的技能。

纵马踏花向自由 3007

插入排序(Insertion Sort)

插入排序(Insertion Sort)。用函数编程实现在一个按升序排序的数组中查找x应插入的位置,将x插入数组中,使数组元素仍按升序排列。 **输入格式要求:"%d" 提示信息:"Input array size:" "Input array:" "Input x:" **输出格式要求:"After insert %d:\n" "%4d" 程序运行示例如下: Input array size:5 Input array:1 3 5 7 9 Input x:4 After insert 4: .

lalababa11的博客 3522

科研级YOLOv8 Neck革新:BiFPN双向特征金字塔赋能,让多尺度融合更高效的实战指南

在文件夹下新建BiFPN.py,将上述BiFPNLayer和BiFPN类的代码写入其中。这一步是为了让YOLOv8的代码架构能识别我们的自定义Neck模块。

m0_64661770的博客 153

点云配准3:3d-ndt算法在pcl上的实现以及参数设置

3d-ndt算法在pcl上的使用方法以及参数设置

诺有缸的高飞鸟的博客 7892

Insertion Sort List对链表进行插入排序

对链表进行插入排序。插入排序的动画演示如上。从第一个元素开始,该链表可以被认为已经部分排序(用黑色表示)。每次迭代时,从输入数据中移除一个元素(用红色表示),并原地将其插入到已排好序的链表中。 插入排序算法:插入排序是迭代的,每次只移动一个元素,直到所有元素可以形成一个有序的输出列表。每次迭代中,插入排序只从输入数据中移除一个待排序的元素,找到它在序列中适当的位置,并将其插入。重复直到所有输入数据...

qq_26410101的博客 890

【论文复现】Applied Intelligence 2025:Auto-PU正例无标签学习的自动化实现与GPT-5.4辅助编程实战

正例-无标签学习(Positive-Unlabelled Learning, PU Learning)是机器学习领域处理"只有正例标签,负例完全未知"场景的重要技术。本文基于2025年发表于Applied Intelligence的最新研究成果,详细阐述如何从零复现Auto-PU框架(包含GA-Auto-PU、BO-Auto-PU、EBO-Auto-PU三种优化器)。

nmdbbzcl的博客 1390

插入排序(INSERTION_SORT)

插入排序(INSERTION_SORT)    1)原理 : 插入排序对于少量的元素排序是一个有效的算法。插入排序的工作方式像是在拿扑克牌一样,最开始的时候手里是空的,每抽到一张牌就将其在另一只手上按一定的规律排好序,直到所有的元素排列完成。    2)C语言实现 :#include<stdio.h> #include<cstdlib> void sortNum(int count, int *a)

凹凸曼哒小乖兽 1711

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

C++编写经典算法之一:插入排序InsertionSort

“插入排序”是数列排序的算法之一。 其思路引点来自于我们平时打扑克牌的习惯。 “我们在整理扑克牌时,往往会倾向于将无序的扑克牌升序或降序的排列,其方法在于拿起一张牌,与其他牌对比,如果是升序排列,那就与左边的牌进行对比,将其放在比此牌大且比此牌小的位置,重复这个过程,就会得到一个有序的牌组。” 算法思路 首先,得到一个随机的数列。 左端的数字已完成排序。 然后,取出那些尚未操作的左端的数...

kevinmeanscool的博客 1518

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

排序算法3-插入排序

描述 该算法维护一个有序序列,然后把无序序列中的元素,在有序序列中从后往前进行扫描,找到位置后插入。从一个元素开始,该元素可以认为已经被排序好的。在有序序列从后往前扫描的过程中,也要将已排序的元素逐个后移,为新插入的元素提供位置 代码实现 /** * 插入排序 */ public class InsertSort { public static void main(String[] args) { int[] arr = {3, 9, -1, 10, -20};

混子的博客 325

insertion-sort-list——链表、插入排序、链表插入

  Sort a linked list using insertion sort. PS:需要考虑left为head且只有一个数时,此时left-&gt;==NULL,若right&lt;left则应更新left。 比较p-&gt;next-&gt;val与right-&gt;val以此来避免需要记录preNode 1 /** 2 * Definition for singly-link...

weixin_34241036的博客 210

插入排序(InsertionSort)

一、插入排序思想 插入排序分为直接插入排序,二分插入排序,希尔排序。 其中直接插入排序和二分插入排序是稳定的算法,希尔排序是不稳定的算法。 直接插入排序        通过设置哨位,每次将哨位中的数插入哨位前已经排序好的序列,得到新的排序好的序列,然后哨位递增,直到哨位挪动至待排序序列的最后一位为止。 基本思路: 1、设置哨位i = 1 2、将a[i]与a[0

jinwanchiji的博客 7298

编写函数,实现插入排序

插入排序是指,先假定将 n 个元素的数列分为已有序和无序两个部分;然后将无序数列的第一个元素与有序数列的元素从后往前逐个进行比较,找出插入位置,将该元素插入到有序数列的合适位置中。 使用 JavaScript 编写的插入排序函数如下所示:function insertionSort(arr) { //从第二个元素开始 for (var i = 1; i < arr.

泠泠似水 2939

采用直接插入排序将一个带头结点的单链表递增有序

void Sort(LinkList &L) { LNode *p=L->next, *pre; LNode *r = p->next; //r保证*p后继结点不断链 p->next = NULL; //只构造一个数据节点的单链表,此时L->next也指向这个 p=r; //p开始工作 while(p!=NU...

weixin_30755709的博客 1211

INSERTION-SORT插入排序

插入排序

qq_21153303的专栏 415

经典算法(8)- 插入排序(Insertion Sort) 及三个基本排序算法的比较

 插入排序的基本思想是每次取右边的第一个元素,将它与左边已经排好序的元素一一比较,如果该元素比第j个元素大,就将该元素插入到第j和第j+1个元素之间。 最坏的情况下(比如输入序列是个逆序),每个元素都需要跟左边已经排好序的所有元素比较,总的比较次数为:1+2+...+(n-2)=(n-1)(n-2)/2 ~ O(n^2); 插入操作需要将插入位置右边的元素平移一个位置,总得移动操作次数也为O(n^2)。 插入排序是稳定的(stable),这与选择排序不同(选择排序用的是交换非相邻元素位置,所以不稳定),

ljsspace的专栏 2029

leetcode系列-对链表进行插入排序(insertion sort list)(看到这个题解,我都惊呆了系列)

分类:链表 难度:medium 方法:指针加速 对链表进行插入排序 对链表进行插入排序。 插入排序的动画演示如上。从第一个元素开始,该链表可以被认为已经部分排序(用黑色表示)。 每次迭代时,从输入数据中移除一个元素(用红色表示),并原地将其插入到已排好序的链表中。 插入排序算法: 插入排序是迭代的,每次只移动一个元素,直到所有元素可以形成一个有序的输出列表。 每次迭代中,插入排序只从输入数据中...

Yolo_C的博客 314

Leetcode每日一题:147.insertion-sort-list(对链表进行插入排序)

思路:因为链表的特性,插入排序无法从当前元素往前遍历,所以这里直接从头开始查找插入位置,分头部插入、中间插入和尾部插入; ListNode *insertionSortList(ListNode *head) { if (!head || !(head->next)) return head; ListNode *cur = head->next; head->next = nullptr; ListNode *next = nullp.

CodeLuweir 的博客 361

单链表的直接插入排序

LeetCode第147题单链表的插入排序 题目描述: 对链表进行插入排序。 插入排序算法: 插入排序是迭代的,每次只移动一个元素,直到所有元素可以形成一个有序的输出列表。 每次迭代中,插入排序只从输入数据中移除一个待排序的元素,找到它在序列中适当的位置,并将其插入。 重复直到所有输入数据插入完为止。 示例 1: 输入: 4->2->1->3 输出: 1->2->3->4 示例 2: 输入: -1->5->3->4->0 输出: -1->0

qq_49259434的博客 3298
上一篇: Populating Next Right Pointers in Each Node II 任意(非完美)二叉树添加next指针 @LeetCode
下一篇: Binary Tree Zigzag Level Order Traversal 二叉树按层遍历,zigzag输出@LeetCode
chiiis
博客等级 码龄14年 422粉丝 429原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值