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

【力扣打卡系列】反转链表

坚持按题型打卡&刷&梳理力扣算法题系列,语言为go,Day12

反转链表
  • 题目描述

在这里插入图片描述

  • 解题思路
    • 最开始的头节点为空,可以赋值为nil
    • 从前往后依次逆转下一个节点的指向即可
  • 代码参考
/*** Definition for singly-linked list.* type ListNode struct {*     Val int*     Next *ListNode* }*/
func reverseList(head *ListNode) *ListNode {var pre *ListNode= nilcur := headfor cur != nil{next :=cur.Nextcur.Next = prepre = curcur =next}return pre
}
  • tips
    • 当前第一个节点指向的是头节点head
    • 注意需要单开一个next节点来存储当前节点原来的next值
    • 循环条件为cur != nil,不能省略为cur,因为不是布尔类型的值
    • 最后返回当前最后一个节点(pre),也就是新链表的头节点
反转链表2
  • 题目描述

在这里插入图片描述

  • 解题思路
    • 首先初始化哨兵节点
    • P0:指向开始被反转的节点的前一个未反转的节点的指针
    • right-left+1是被反转的节点个数
    • 最终p0指向下一个节点是已经反转的最后一个节点pre,即反转链表的头节点
    • 原先p0指向下一个节点指向cur
  • 代码参考
/*** Definition for singly-linked list.* type ListNode struct {*     Val int*     Next *ListNode* }*/
func reverseBetween(head *ListNode, left int, right int) *ListNode {guard := &ListNode{Next:head}p0 := guardfor i:=0;i<(left-1);i++{p0 = p0.Next}cur := p0.Nextvar pre *ListNodepre = nilfor i:=0;i<(right-left+1);i++{next := cur.Nextcur.Next = prepre = curcur = next}p0.Next.Next = curp0.Next = prereturn guard.Next
}
  • tips
    • 性质:反转结束后,从原来的链表来看
    • pre指向反转这一段的末尾
    • cur指向反转这一段后续的下一个节点
    • 特殊情况:left等于1的时候没有p0
    • 解决:在前面加一个哨兵节点,这样p0就存在了
    • 注意哨兵节点的声明:guard := &ListNode{Next:head},不能先Var再赋值next
    • 注意指定次数的for循环的写法: for i:=0;i<(right-left+1);I++
    • 注意pre的声明及初值,要放在逆转循环体的外面:
      • var pre *ListNode
        pre = nil
    • 注意最后这里勿漏next:
      • p0.Next.Next = cur
        p0.Next = pre
    • 为什么最终返回guard.Next:因为当left=1时,原先的head就被反转了,所以不能返回head
k个一组翻转链表
  • 题目描述
    在这里插入图片描述
  • 解题思路
    • 先拿到链表长度,求出有多少组k
    • 求链表长度n
      • for cur != nil{
        ​ cur = cur.Next
        ​ n++
        ​ }
    • 中间记得保存一下p0.Next的值
  • 代码参考
/*** Definition for singly-linked list.* type ListNode struct {*     Val int*     Next *ListNode* }*/
func reverseKGroup(head *ListNode, k int) *ListNode {n := 0guard := &ListNode{Next:head}p0 := guardcur := headfor cur != nil{cur = cur.Nextn++}cur = p0.Nextvar pre *ListNodepre = nilfor num := n/k;num != 0;num--{for i:=0;i<k;i++{nxt := cur.Nextcur.Next = prepre = curcur = nxt}nxt_p0 := p0.Nextp0.Next.Next = curp0.Next = prep0 = nxt_p0}return guard.Next
}
  • tips
    • 也是需要一个哨兵节点,用来找到头节点
    • 注意最后要更新p0
      • 需要把nxt_p0 := p0.Next先存下来
    • 顺序不能颠倒!
      • p0.Next.Next = cur
        p0.Next = pre

http://www.mrgr.cn/news/62079.html

相关文章:

  • 嵌入式 C 语言:一维数组
  • 【Rust 知识点杂记】
  • 认识+安装ElasticSearch
  • 第四、五章补充:线代本质合集(B站:小崔说数)
  • 一款FPGA芯片开发的核心板(EP4CE6核心板)
  • 基于Arduino的FPV头部追踪相机系统
  • python 模块和包、类和对象
  • VBA语言専攻介绍20241031
  • android 12 禁止三方APP 使用API 直接打开wifi的修改方法
  • IDEA 社区版 lombok插件报错(java:方法引用无效)
  • MongoDB 部署指南:从 Linux 到 Docker 的全面讲解
  • 算法|牛客网华为机试11-20C++
  • 树莓派4处理器超频指南
  • 两步GMM计算权重矩阵
  • matlab读取逐日的1km分辨率中国大陆地区的土壤水数据,并汇总至逐月分辨率
  • 数字化平台助力:国际数字影像产业园打造智慧园区生态圈
  • (也许是全网首发!)Qt6 编译著名Widgets组件 Qt Material Widgets by MSVC / Mingw
  • 设计产品宣传册没参考?推荐一个超多产品宣传册案例的网站
  • OpenJudge:找和为K的两个元素
  • 接口自动化测试平台项目环境搭建
  • MySQL-SQL性能分析
  • 【Stable Diffusion - Ai】小白入门必看(涂鸦、涂鸦重绘、局部重绘和重绘蒙版篇)!真材实料!不卖课!!!
  • 跨平台实现实时通讯
  • 【iOS】SDWebImage
  • 海外联盟营销入门:2024最新指南
  • 玄机-应急响应- Linux入侵排查