当前位置: 首页 > news >正文

Golang leetcode206 翻转链表 迭代 递归 双指针

文章目录

  • 翻转链表 leetcode206
    • 题解第一版 直接建立新的链表
    • 双指针迭代
          • 递归法

翻转链表 leetcode206

至此走到这里,我们对于链表的结构应当已经比较熟悉,下面的就是敢于操作

题解第一版 直接建立新的链表

时间复杂度太高

// 初始方法,建立新链表
func reverseList(head *ListNode) *ListNode {NewNode := &ListNode{}for ; head != nil; head = head.Next {NewNode.Val = head.ValNewNode = &ListNode{Next: NewNode}}return NewNode.Next
}

双指针迭代

其实在初始时也曾考虑过,最后没有直面的勇气,抽自己两个大嘴巴子,必须醒悟,fuckmyself
当时卡在觉得修改顺序会将链表后面的一大串也甩过来,现在发现多虑了

// 迭代 双指针法
func reverseList(head *ListNode) *ListNode {如果原链表为空或者nil,直接返回原链表//if head == nil || head.Next == nil {//	return head//}// 0 1 2 3 4cur := head//pre := &ListNode{}var pre *ListNode //这样定义不分配内存,在后续第一次向外赋值即为nil;而上面的定义则会为0//结果后续函数可以覆盖前面的特殊情况 :)for cur != nil {c := cur.Nextcur.Next = prepre = curcur = c}return pre}
递归法

链表的操作需要记住三个东西,上一个是谁,我是谁,下一个是谁。

用递归帮忙记住了上一个是谁,那么问题是我是谁,下一个是谁?第一行的if判断,是两种临界情况,第一种是头结点为空,不用管;第二种是没有下一个了,只用知道我是谁,直接返回就行。下面的几行代码,我明显是head,下一个就是head->next,由于要反转链表,我的下一个要变成我的上一个,因此head->next->next = head,我的上一个(递归)等到这层递归出去再解决。可以看到newHead在递归结束返回后是没有进行任何操作的,也就是返回的是最底层的那个,起到传递尾(新首)结点的作用

// 递归,也为双指针
// 把自己和后面的换
func reverseList(head *ListNode) *ListNode {//递归结束条件if head == nil || head.Next == nil {return head}//调用自身newHead := reverseList(head.Next)//处理递归//由于翻转链表,那么我们的目的就是目前节点的下一个改为上一个//目前节点head.nexthead.Next.Next = head//上面这么写会使链表成环,这里要打破 环head.Next = nilreturn newHead
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • unknown variable ‘authentication_policy=mysql_native_password‘
  • 图像分割实战-系列教程7:unet医学细胞分割实战5(医学数据集、图像分割、语义分割、unet网络、代码逐行解读)
  • LeetCode 1758. 生成交替二进制字符串的最少操作数【字符串,模拟】1353
  • 2024年01月数据库流行度最新排名
  • 开源掌机是什么?
  • FA模板制作
  • R_handbook_统计分析
  • 数据结构:队列(链表和数组模拟实现)
  • 大数据机器学习GAN:生成对抗网络GAN全维度介绍与实战
  • 系统学习Python——装饰器:函数装饰器-[对方法进行装饰:基础知识]
  • 基础算法-归并排序
  • 20231228在Firefly的AIO-3399J开发板的Android11使用Firefly的DTS配置单前后摄像头ov13850
  • Pandas的apply方法的应用练习
  • 2023-12-12LeetCode每日一题(下一个更大元素 IV)
  • SDG大数据平台简介
  • JS 中的深拷贝与浅拷贝
  • 【跃迁之路】【477天】刻意练习系列236(2018.05.28)
  • Angular js 常用指令ng-if、ng-class、ng-option、ng-value、ng-click是如何使用的?
  • Angularjs之国际化
  • crontab执行失败的多种原因
  • css属性的继承、初识值、计算值、当前值、应用值
  • Docker下部署自己的LNMP工作环境
  • happypack两次报错的问题
  • niucms就是以城市为分割单位,在上面 小区/乡村/同城论坛+58+团购
  • Objective-C 中关联引用的概念
  • React的组件模式
  • Spring Cloud Feign的两种使用姿势
  • vuex 笔记整理
  • vue数据传递--我有特殊的实现技巧
  • 不用申请服务号就可以开发微信支付/支付宝/QQ钱包支付!附:直接可用的代码+demo...
  • 工作踩坑系列——https访问遇到“已阻止载入混合活动内容”
  • 马上搞懂 GeoJSON
  • 前端性能优化——回流与重绘
  • 为视图添加丝滑的水波纹
  • linux 淘宝开源监控工具tsar
  • ​虚拟化系列介绍(十)
  • #FPGA(基础知识)
  • #我与Java虚拟机的故事#连载13:有这本书就够了
  • $HTTP_POST_VARS['']和$_POST['']的区别
  • (13)[Xamarin.Android] 不同分辨率下的图片使用概论
  • (1综述)从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练
  • (4)Elastix图像配准:3D图像
  • (Spark3.2.0)Spark SQL 初探: 使用大数据分析2000万KF数据
  • (笔记)Kotlin——Android封装ViewBinding之二 优化
  • (二)PySpark3:SparkSQL编程
  • (黑马出品_高级篇_01)SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式
  • .gitignore
  • .NET BackgroundWorker
  • .NET C# 使用GDAL读取FileGDB要素类
  • .NET MAUI Sqlite程序应用-数据库配置(一)
  • .net与java建立WebService再互相调用
  • .net知识和学习方法系列(二十一)CLR-枚举
  • .net中应用SQL缓存(实例使用)
  • .project文件
  • .pyc文件还原.py文件_Python什么情况下会生成pyc文件?