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

【代码随想录】算法训练计划03

1、203. 移除链表元素

题目:
给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。
输入:head = [1,2,6,3,4,5,6], val = 6
输出:[1,2,3,4,5]
在这里插入图片描述

思路:
  • 移除链表元素,链表一定要注意虚拟头
  • 不要忘记不删除的时候要前移元素
  • 注意 cur 的赋值方式
  • 注意是初始化一个虚拟头节点,和声明分别开
// 代码一刷——虚拟头
func removeElements(head *ListNode, val int) *ListNode {
   dummy := &ListNode{}
   dummy.Next = head
   //cul.Next := head 这种写法错了
   cul := dummy
   for cul.Next != nil {
       if cul.Next.Val == val {
           cul.Next = cul.Next.Next
       } else { // 不要忘记前移
           cul = cul.Next
       }
   }
   return dummy.Next
}

2、707. 设计链表

题目:
题目太长了就不复制了

思路:
  • 这题吧,主要两点
  • 1、注意条件说的是 index 是下标
  • 2、注意边界条件,-1 啥的
// 代码一刷
type SingleNode struct {
    Val int
    Next *SingleNode
}

type MyLinkedList struct {
    dummyHead *SingleNode
    Size int
}


func Constructor() MyLinkedList {
    newNode := &SingleNode{
        -99,
        nil,
    }
    return MyLinkedList{
        dummyHead: newNode,
        Size: 0,
    }
}


func (this *MyLinkedList) Get(index int) int {
    //获取链表中下标为 index 的节点的值。如果下标无效,则返回 -1 
    if this == nil || index < 0 || index >= this.Size {
        return -1
    }
    cur := this.dummyHead.Next
    for i:=0; i<index; i++ {
        cur = cur.Next
    }
    return cur.Val
}


func (this *MyLinkedList) AddAtHead(val int)  {
    newNode := &SingleNode{Val:val}
    newNode.Next = this.dummyHead.Next
    this.dummyHead.Next = newNode
    //return this.Next
    this.Size++
}


func (this *MyLinkedList) AddAtTail(val int)  {
    cur := this.dummyHead
    for cur.Next != nil {
        cur = cur.Next
    }
    newNode := &SingleNode{Val: val}
    cur.Next = newNode
    this.Size++
}


func (this *MyLinkedList) AddAtIndex(index int, val int)  {
    //
    if index < 0 {
        index = 0
    } else if index > this.Size {
        return
    }
    
    newNode := &SingleNode{Val:val}
    cur := this.dummyHead
    for i:=0; i<index; i++ {
        cur = cur.Next
    }
    newNode.Next = cur.Next
    cur.Next = newNode
    this.Size++
}


func (this *MyLinkedList) DeleteAtIndex(index int)  {
    if index < 0 || index >= this.Size {
        return
    }
    cur := this.dummyHead
    for i:=0; i<index; i++ {
        cur = cur.Next
    }
    if cur.Next != nil {
        cur.Next = cur.Next.Next
    }
    
    this.Size--
}


/**
 * Your MyLinkedList object will be instantiated and called as such:
 * obj := Constructor();
 * param_1 := obj.Get(index);
 * obj.AddAtHead(val);
 * obj.AddAtTail(val);
 * obj.AddAtIndex(index,val);
 * obj.DeleteAtIndex(index);
 */


3、206. 反转链表

题目:
给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。
输入:head = [1,2,3,4,5]
输出:[5,4,3,2,1]

思路:
  • 写老多遍了,这最少是第 7 遍,说说这次注意点吧
  • 1、注意声明两个变量,pre,cur
  • 2、注意 pre 声明,但是不初始化,因为不要 nil,看输入输出就知道了
// 代码一刷——只需要声明一个 pre 即可,不需要初始化
func reverseList(head *ListNode) *ListNode {
    var pre *ListNode
    cur := head
    for cur != nil {
        next := cur.Next
        cur.Next = pre
        pre = cur
        cur = next
    }
    return pre
}

http://www.kler.cn/a/106506.html

相关文章:

  • 查询DBA_FREE_SPACE缓慢问题
  • 蓝队基础1
  • 【已解决】git push一直提示输入用户名及密码、fatal: Could not read from remote repository的问题
  • CC6学习记录
  • Essential Cell Biology--Fifth Edition--Chapter one (6)
  • WPF中如何使用区域导航
  • Centos7 安装和配置 Redis 5 教程
  • 视频相关学习笔记
  • 云台/稳定器/无人机姿态控制之欧拉角与四元数控制优缺点分析
  • 记一次任意文件下载到Getshell
  • 文件权限详解
  • 【Linux】部署单机OA项目及搭建spa前后端分离项目
  • 【软考系统架构设计师】2023年系统架构师冲刺模拟习题之《数据库系统》
  • Leetcode—66.加一【简单】
  • JSON(详解)
  • JVM进阶(2)
  • ESP32网络开发实例-HTTP-GET请求
  • 常规APP在客户端层面潜在应用安全问题探讨
  • MySQL比较两个表数据的差异
  • Onnx精度转换 FP32->FP16
  • 全栈经验总结(不间断更新)
  • vite vue3 ts 使用sass 设置样式变量 和重置默认样式
  • HJ18 识别有效的IP地址和掩码并进行分类统计
  • 【算法|动态规划No30】leetcode5. 最长回文子串
  • gRPC之gateway集成swagger
  • 【C#】LIMS实验室信息管理系统源码