链表反转 - 链表排序 算法

2023-05-16

链表反转:

  • 想象有1个新链表,每次从旧链表取出一个元素,然后插入到新链表的头部

链表排序:

  • 先将链表拆分为2个子链表
    • 使用快慢指针,快指针每次走2步,当快指针走到尾部时,慢指针即在中间位置
  • 对2个子链表递归排序,返回2个有序的子链表
  • 合并2个有序子链表
package main

import (
	"fmt"
)

type node struct {
	next  *node
	value int
}

func newNode(x int) *node {
	return &node{
		next:  nil,
		value: x,
	}
}

func printList(head *node) { //打印链表
	if head == nil {
		return
	}

	for head != nil {
		fmt.Print(head.value, "->")
		head = head.next
	}
	fmt.Println("nil")
}

func buildList(datas []int) *node { //基于数组创建链表
	if len(datas) == 0 {
		return nil
	}

	head := newNode(datas[0])
	curr := head
	for i := 1; i < len(datas); i++ {
		nextnode := newNode(datas[i])
		curr.next = nextnode
		curr = nextnode
	}
	return head
}

func reverse(head *node) (newhead *node) { //反转链表
	for curr := head; curr != nil; {
		next := curr.next

		curr.next = newhead //头部插入新链表
		newhead = curr

		curr = next
	}
	return
}

func sortList(head *node) (newhead *node) { //链表排序
	if head == nil || head.next == nil { //只有1个node,不用排序
		newhead = head
		return
	}

	/* 找到中点位置,分成2个子链表,做链表的归并排序 */
	head1, head2 := splitList(head)
	sortHead1 := sortList(head1) //对两个子链表分别排序
	sortHead2 := sortList(head2)

	if sortHead1.value < sortHead2.value { //先确定新链表的头结点
		newhead = sortHead1
		sortHead1 = sortHead1.next
		newhead.next = nil
	} else {
		newhead = sortHead2
		sortHead2 = sortHead2.next
		newhead.next = nil
	}

	curr := newhead
	for sortHead1 != nil && sortHead2 != nil { //同时遍历2个子链表
		if sortHead1.value < sortHead2.value {
			curr.next = sortHead1
			sortHead1 = sortHead1.next

		} else {
			curr.next = sortHead2
			sortHead2 = sortHead2.next
		}

		curr = curr.next
		curr.next = nil
	}

	if sortHead1 != nil {
		curr.next = sortHead1
	}
	if sortHead2 != nil {
		curr.next = sortHead2
	}
	return
}

func splitList(head *node) (head1, head2 *node) { //拆分链表
	head1 = head

	if head == nil || head.next == nil { //只有1个结点
		return
	} else if head.next.next == nil { //只有2个结点,一边一个
		head2 = head.next
		head1.next = nil
		return
	}

	slow, fast := head, head
	for fast != nil && fast.next != nil { //快慢指针
		slow = slow.next
		fast = fast.next.next
	}

	head2 = slow.next //慢指针后面的部分,作为第2个链表
	slow.next = nil
	return
}

func main() {

	testCase := 0
	switch testCase {
	case 0:
		head := buildList([]int{5, 6, 7, 8, 9, 10, 1, 2, 3, 4})
		printList(reverse(head))

	case 1:
		head := buildList([]int{5, 6, 7, 8, 9, 10, 1, 2, 3, 4})
		head1, head2 := splitList(head)
		printList(head1)
		printList(head2)

	case 2:
		head := buildList([]int{5, 6, 7, 8, 9, 10, 1, 2, 3, 4})
		printList(sortList(head))
	}

	fmt.Println("Hello World")
}

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

链表反转 - 链表排序 算法 的相关文章

  • Mysql5.6安装以及修改默认存储路径

    安装流程 1 获取rpm包 rpm Uvh http dev mysql com get mysql community release el7 5 noarch rpm 2 安装 yum y install mysql community
  • Nacos在derby模式下如何更改密码?

    1 下载管理工具 下载官方管理工具 Apache Derby 10 14 2 0 Release 下载完成后 xff0c 上传至服务器 xff0c 并解压 xff0c 就可以使用 ij 这个客户端连接工具了 2 连接derby 注意 xff
  • 异常:CategoryInfo : SecurityError: (:) [],PSSecurityException + FullyQualifiedErrorId :

    执行yarn install yarn 无法加载文件 C Users Administrator AppData Roaming npm yarn ps1 xff0c 因为在此系统上禁止运行脚本 有关详细信息 xff0c 请参阅 https
  • left join查询优化

    SQL查询优化 LEFT JOIN和INNER JOIN 1 连接了八个数据库表 xff0c 而且全部使用LEFT JOIN xff0c 如下所示 xff1a Resource Resources A LEFT JOIN Resource
  • DB2 修改表字段长度

    ALTER table table alter column column set data type VARCHAR 50 reorg table table
  • maven用命令怎么更新依赖包

    maven mvn clean install e U e详细异常 xff0c U强制更新 mvn archetype generate DgroupId 61 damocles autocredit DartifactId 61 damo
  • db2取前n条记录

    select a from table a where id 61 370 fetch first n rows only
  • 批量执行某个文件夹下所有的 .sql脚本

    copy sql all ren all all sql sqlplus aa bb 64 all 在windows下我用dir b sqlfile gt sql txt 然后用UE的列编辑模式 xff0c 给行头都加上 64 xff0c
  • FreeRTOS-Task

    Task FreeRTOS中Task为调度单位 xff0c 是独立的运行实例 xff0c 具有自己的堆栈空 间 Task通常是无限循环执行 xff0c 不允许以任何方式退出实现函数 xff08 return 语句或者运行结束 xff09 如
  • 面试必看!一线互联网公司技术面试的流程以及注意事项

    企业一般通过几轮技术面试来考察大家的各项能力 xff0c 一般流程如下 一面机试 xff1a 一般会考选择题和编程题二面基础算法面 xff1a 就是基础的算法都是该专栏要讲的三面综合技术面 xff1a 会考察编程语言 xff0c 计算机基础
  • 去哪儿2017校园招聘笔试题

    span class hljs keyword import span java util Scanner span class hljs javadoc filename extension 时间限制 xff1a C C 43 43 语言
  • 日志文件xml

    lt xml version 61 34 1 0 34 encoding 61 34 UTF 8 34 gt lt ConsoleAppender 控制台输出日志 gt lt appender name 61 34 STDOUT 34 cl
  • STM32输出PWM波形错误解析

    一 背景 项目中需要用STM32F407输出4路PWM波形控制两个A4950模块 xff0c 从而驱动2个直流电机 使用TIM1的在PE9 PE11 PE13 PE14上分别产生4路PWM波形 xff0c 前两路 xff08 记作pwm1
  • Kubernetes 1.20:最优秀、美妙、酷的版本

    你填了吗 xff1f 2020年CNCF中国云原生问卷 问卷链接 xff08 https www wjx cn jq 97146486 aspx xff09 作者 xff1a Kubernetes 1 20发布团队 我们很高兴地宣布Kube
  • C++常见问题总结

    C 43 43 问题总结模块 编程之路总是路漫漫其修远兮 xff0c 吾将上下而求索 1 no matching function for call to 借用CSDN某位的文章 xff0c 成功修改错误 大概截图如下 源代码 xff1a

随机推荐

  • 字符串函数strchr 、 strrchr 、strrstr的实现

    include lt stdio h gt include lt stdlib h gt include lt assert h gt char my strchr const char dst char c 由于我们只是查找 xff0c
  • cadence常见问题一

    1 在画元件库时 xff0c 双击编辑一个引脚 xff0c 编辑好了点了OK xff0c 引脚就从左边跑到了右边 xff1f xff1f xff1f 居然不是固定的 xff1f 我在user properties设置下引脚名字可视化 xff
  • keil,stm32,watch窗口,正确的串口数据后面还出现ASCII字符?

    这个问题不知道如何解决 xff0c 串口调试助手数据显示都是准确的 xff0c watch窗口看就不正确 不知道正确数据后面的是什么 xff1f
  • MS5611气压计数据测试报告

    气压计测得气压和温度值为模拟量 xff0c ms5611气压计会自动将模拟量转换成数字量 xff0c 对于不同的精度 xff0c 转换时间也不相同 本测试选用的精度为最高的OSR 61 4096 xff0c 如下表所示 xff0c 转换时间
  • Fatfs文件系统,f_open函数返回值为FR_DISK_ERR解决方法

    最近在操作TF卡 xff0c 芯片stm32f103c8t6 xff0c 编译环境KEIL xff0c 金士顿32G卡 xff0c 用Fatfs文件系统向卡中写入数据 出现的问题 xff1a f open函数返回值为FR DISK ERR
  • Fatfs文件系统向文件写内容出现f_write返回值为1的问题

    f write返回值为1 xff0c 则就是FR DISK ERR 1 A hard error occurred in the low level disk I O layer 低级磁盘I O层中发生硬错误 问题解决方式 xff1a 1
  • vl53l1x激光测距讲解

    使用模块 ATK VL53L0X激光测距模块或者淘宝其他模块 通信方式 xff1a IIC xff0c 接口SHUT用于开机启动时序中 xff0c int是中断模式中的引脚 xff08 触发中断 xff09 参考资料 xff1a https
  • 如何完成一篇发明专利

    专利的组成部分 xff1a 说明书摘要摘要附图权利要求书说明书说明书附图 参考的文献有 专利法 专利审查指南 xff0c 大致写完一篇发明专利需要半个月的时间 xff1b 参考网址 xff0c http www soopat com htt
  • cmd python 缩进 3个点

    问题描述 xff1a indentationerror expected an indented block for 语句和if语句都会遇到 xff0c 解决方法是for 语句和if语句冒号后 xff0c 按enter切换下一行 xff0c
  • 陀螺仪和加速度计MPU6050的单位换算方法

    对于四轴的初学者 xff0c 可能无法理解四轴源代码里面陀螺仪和加速度数据的那些数学转换方法 下面我们来具体描述下这些转换方法 我们首先来看陀螺仪数据 在MPU6050的手册里面 xff0c 提供了一个陀螺仪数据表如下 xff1a 在表格里
  • 【Final Project】Kitti的双目视觉里程计(1)

    1 从CMake文件了解整体结构 xff08 1 xff09 前置工作 0 xff09 文件结构 app CMakeLists txt run kitti stereo cpp CMakeLists txt cmake modules Fi
  • 觅香

    立于浮华之世 奏响天籁之音
  • 多旋翼无人机推荐书

    惯性仪器测试与数据分析 惯性导航 xff08 秦永元 xff09 先进 PID 控制 MATLAB 仿真 多旋翼飞行器设计与控制
  • 飞控PID详解

    串级PID xff1a 单极PID适合线性系统 xff0c 当输出量和被控制量呈线性关系时单极PID能获得较好的效果 xff0c 但是四轴不是线性系统 xff0c 现代学者认为 xff0c 四轴通常可以简化为一个二阶阻尼系统 为什么四轴不是
  • Keil:ST-LINK USB communication error

    error flash download failed target dll has been cancelled 1 USB口的问题 xff1a USB供电不好 xff0c 或则USB驱动程序或ST Link驱动程序有问题 我的解决方案就
  • Cadence OrCAD BOM如何输出封装信息

    Cadence OrCAD 如何输出带封装信息的BOM 1 选中DSN文件 xff0c 打开Tools菜单中 选择Bill of materials选项 2 Bill of materials对话框设置如下 3 ORCAD输出的BOM表是文
  • 随机排列算法及《算法导论》5.3节习题解答

    随机排列算法及 算法导论 5 3节习题解答 算法导论 介绍了两种随机排列数组的算法 第一种算法是为数组的每个元素A i 赋一个随机的优先级P i xff0c 然后依据优先级对数组A中的元素进行排序 例如 xff0c 如果初始数组A 61 1
  • 【Ubuntu-Tensorflow】GPU设置及显存资源分配

    最近笔者在做GPU显存资源分配的研究 xff0c 发现在tf中gpu一些实用的方法和接口 xff0c 共享出来 xff0c 供大家参考学习 xff0c 如有问题 xff0c 欢迎留言讨论 1 运行程序时 xff0c 控制台设置GPU运行参数
  • 为了解决jetson tx2的内存不足。挂载sd卡,并且使用docker在sd中安装jetPack的镜像。

    1 xff0c 使用nvidia官方的sdkmanager工具给jetson tx2刷机 xff0c 并且将sd卡挂载在系统目录下 参考ubuntu18 04主机 43 Jetson TX2 NX刷机 lgh15897723511的博客 C
  • 链表反转 - 链表排序 算法

    链表反转 xff1a 想象有1个新链表 xff0c 每次从旧链表取出一个元素 xff0c 然后插入到新链表的头部 链表排序 xff1a 先将链表拆分为2个子链表 使用快慢指针 xff0c 快指针每次走2步 xff0c 当快指针走到尾部时 x