Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >​2021-03-17:手写代码:单链表插入排序。

​2021-03-17:手写代码:单链表插入排序。

原创
作者头像
福大大架构师每日一题
修改于 2021-03-18 02:09:17
修改于 2021-03-18 02:09:17
2710
举报

2021-03-17:手写代码:单链表插入排序。

福大大 答案2021-03-17:

从链表的第二个节点开始遍历。当前节点的左边所有节点一定是有序的。先比较当前节点和左邻节点,如果左邻节点小于等于当前节点,直接下个节点;如果左邻节点大于当前节点,从链表的有序部分的第一个节点开始遍历,找到当前节点小于有序部分的某个节点,然后插入进去。

代码用golang编写,代码如下:

代码语言:txt
AI代码解释
复制
package main

import "fmt"

func main() {
    //head := &ListNode{Val: 4}
    //head.Next = &ListNode{Val: 2}
    //head.Next.Next = &ListNode{Val: 1}
    //head.Next.Next.Next = &ListNode{Val: 3}

    head := &ListNode{Val: -1}
    head.Next = &ListNode{Val: 5}
    head.Next.Next = &ListNode{Val: 3}
    head.Next.Next.Next = &ListNode{Val: 4}
    head.Next.Next.Next.Next = &ListNode{Val: 0}

    printlnLinkNodeList(head)

    head = InsertSort(head)

    printlnLinkNodeList(head)
}

//Definition for singly-linked list.
type ListNode struct {
    Val  int
    Next *ListNode
}

//链表打印
func printlnLinkNodeList(head *ListNode) {
    cur := head
    for cur != nil {
        fmt.Print(cur.Val, "\t")
        cur = cur.Next
    }
    fmt.Println()
}

//插入排序
func InsertSort(head *ListNode) *ListNode {
    if head == nil || head.Next == nil {
        return head
    }
    preAns := &ListNode{Next: head}

    pre := head
    cur := head.Next
    for cur != nil {
        if pre.Val <= cur.Val {
            //不管

            //下一个循环的准备工作
            pre, cur = cur, cur.Next
        } else {
            preTemp := preAns
            temp := preAns.Next
            for cur.Val >= temp.Val {
                preTemp, temp = temp, temp.Next
            }

            //删除当前节点
            pre.Next = cur.Next

            //有序节点里插入当前节点
            preTemp.Next, cur.Next = cur, temp

            //下一个循环的准备工作,pre不变
            cur = pre.Next
        }

    }
    return preAns.Next
}

执行结果如下:

在这里插入图片描述
在这里插入图片描述

力扣148. 排序链表

评论

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
2021-03-14:手写代码:单链表冒泡排序。
遍历链表,算出元素个数,假设为N。需要嵌套循环,外循环N-1轮,每轮循环相邻交换N-1次。
福大大架构师每日一题
2021/03/14
4030
​2021-03-15:手写代码:单链表选择排序。
2021-03-15:手写代码:单链表选择排序。 福大大 答案2021-03-15: 遍历链表,找出最小元素,链表里删除最小元素,最小元素放在需要返回的链表里。 代码用golang编写,代码如下: package main import "fmt" func main() { //head := &ListNode{Val: 4} //head.Next = &ListNode{Val: 2} //head.Next.Next = &ListNode{Val: 1} //
福大大架构师每日一题
2021/03/15
2650
​2021-03-15:手写代码:单链表选择排序。
​2021-03-13:手写代码:单链表快排。
根据链表的表头三分。比表头小的元素放左边,比表头大的元素放右边,等于表头的元素放中间。然后递归左边和递归右边。最后合并左、中、右。
福大大架构师每日一题
2021/03/13
2390
​2021-03-13:手写代码:单链表快排。
2021-03-16:手写代码:单链表归并排序。
2021-03-16:手写代码:单链表归并排序。 福大大 答案2021-03-16: 获取链表中点,然后按中点分成两个链表。递归两个链表。合并两个链表。 代码用golang编写,代码如下: package main import "fmt" func main() { //head := &ListNode{Val: 4} //head.Next = &ListNode{Val: 2} //head.Next.Next = &ListNode{Val: 1} //head
福大大架构师每日一题
2021/03/16
3550
2021-04-08:给定一个单链表的头节点head,请判断该链表是否为回文结构。
2021-04-08:给定一个单链表的头节点head,请判断该链表是否为回文结构。
福大大架构师每日一题
2021/04/08
4490
2021-04-08:给定一个单链表的头节点head,请判断该链表是否为回文结构。
单链表排序java_快速排序链表
链表的排序相对数组的排序更为复杂些,也是考察求职者是否真正理解了排序算法(而不是“死记硬背”)
全栈程序员站长
2022/11/07
7000
147. 对链表进行插入排序
插入排序的动画演示如上。从第一个元素开始,该链表可以被认为已经部分排序(用黑色表示)。 每次迭代时,从输入数据中移除一个元素(用红色表示),并原地将其插入到已排好序的链表中。
张伦聪zhangluncong
2022/10/26
6900
2020-11-03:手写代码:链表如何快速找到中间节点?
2.输入链表头节点,奇数长度返回中点,偶数长度返回下中点 。这道题是leetcode上的第876道题,叫【链表的中间节点】。
福大大架构师每日一题
2020/11/03
3140
2020-11-03:手写代码:链表如何快速找到中间节点?
2021-03-27:给你一个链表的头节点 head ,旋转链表
2021-03-27:给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置。输入:head = 1→2→3→4→5, k = 2,输出:4→5→1→2→3。
福大大架构师每日一题
2021/03/27
3380
2021-03-27:给你一个链表的头节点 head ,旋转链表
插入排序
周末又到啦!各位小伙伴周末愉快哈!随着刷题的数量的增多,慢慢感觉到很多题目之间的内在关联,每周遇到的比较新奇的题目还是坚持与各位分享一下~
鹏-程-万-里
2020/06/29
3630
leetcode: 82. Remove Duplicates from Sorted List II
Problem # Given a sorted linked list, delete all nodes that have duplicate numbers, # leaving only distinct numbers from the original list. # # For example, # Given 1->2->3->3->4->4->5, return 1->2->5. # Given 1->1->1->2->3, return 2->3. AC class ListNo
JNingWei
2018/09/27
2670
leetcode每日一题:147. 对链表进行插入排序
插入排序的动画演示如上。从第一个元素开始,该链表可以被认为已经部分排序(用黑色表示)。
用户3578099
2020/11/30
2960
leetcode每日一题:147. 对链表进行插入排序
2021-04-09:rand指针是单链表节点结构中新增的指针,rand可能指向链表中
2021-04-09:rand指针是单链表节点结构中新增的指针,rand可能指向链表中的任意一个节点,也可能指向null。给定一个由Node节点类型组成的无环单链表的头节点 head,请实现一个函数完成这个链表的复制,并返回复制的新链表的头节点。 【要求】时间复杂度O(N),额外空间复杂度O(1) 。
福大大架构师每日一题
2021/04/09
4970
2021-04-09:rand指针是单链表节点结构中新增的指针,rand可能指向链表中
2021-11-07:奇偶链表。给定一个单链表,把所有的奇数节
2021-11-07:奇偶链表。给定一个单链表,把所有的奇数节点和偶数节点分别排在一起。请注意,这里的奇数节点和偶数节点指的是节点编号的奇偶性,而不是节点的值的奇偶性。请尝试使用原地算法完成。你的算法的空间复杂度应为 O(1),时间复杂度应为 O(nodes),nodes 为节点总数。力扣328。
福大大架构师每日一题
2021/11/07
3420
七十一、去重交换排序链表、 求链表的中间结点
最近在重新梳理学算法的知识,本文为链表常见操作复习的总结文章,会讲解常见的链表题目实现思路及附上答案,这些题目在leetcode上对应的题号也有给出,好好学习算法吧~
润森
2022/08/17
4500
七十一、去重交换排序链表、 求链表的中间结点
2023年前端面试题汇总-数据结构(链表)
在计算机里,不保存在连续存储空间中,而每一个元素里都保存了到下一个元素的地址的数据结构,我们称之为链表(Linked List)。链表上的每一个元素又可以称它为节点(Node),而链表中第一个元素,称它为头节点(Head Node),最后一个元素称它为尾节点(Tail Node)。
越陌度阡
2023/06/10
1.1K0
2023年前端面试题汇总-数据结构(链表)
golang刷leetcode 链表(2) 删除重复元素
输入: 1->3->2->3->5->4->4 输出: 1->3->2->5->4 示例 2:
golangLeetcode
2022/08/02
4760
经典算法之链表篇(二)
ma布
2024/10/21
700
经典算法之链表篇(二)
经典算法之链表篇
输入:head = [1,2,3,4,5], left = 2, right = 4 输出:[1,4,3,2,5]
ma布
2024/10/21
530
经典算法之链表篇
四种方法解决leetcode203. 移除链表元素
本文主要针对移除单链表中的元素,提供了四种解题思路,供大家参考,希望能对大家提供帮助。
程序员小熊
2021/05/28
3230
四种方法解决leetcode203. 移除链表元素
推荐阅读
相关推荐
2021-03-14:手写代码:单链表冒泡排序。
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档