代码随想录Day3

文章讲述了链表理论基础,包括LeetCode中的三个问题:移除链表元素、设计链表(单/双链表实现)和反转链表。作者分享了解题思路和注意事项,强调了链表操作中的关键点和常见错误。
摘要由CSDN通过智能技术生成

@代码随想录算法训练营

代码随想录Day3

链表理论基础 203.移除链表元素 ,707.设计链表,206.反转链表

2024/03/23 今日任务:
完成英语每日阅读+听力
论文实验想想要做什么 - 今天改个屁毕业论文,爱咋咋地,反正还没正式查重,被X就被X了,烦的一逼,妈个鸡
答辩PPT - 今天应该可以搞定吧
完成昨天前天和今天的算法代码学习
路由技术卷2,15页还没看 - 累积到27页了。。。3天只看了18页,估计1天清不掉

Day3题目

1、203.移除链表元素
题目链接:https://leetcode.cn/problems/remove-linked-list-elements/
题意:删除链表中等于给定值 val 的所有节点。

示例 1: 输入:head = [1,2,6,3,4,5,6], val = 6 输出:[1,2,3,4,5]

示例 2: 输入:head = [], val = 1 输出:[]

示例 3: 输入:head = [7,7,7,7], val = 7 输出:[]

也就是简单的链表删除,属于链表的基本操作。

解题:emmmm在自己写的时候比较混乱。导致很多条件没有弄清楚,测试用例3以及示例2以为需要额外的条件判断处理,实际上并不需要。
其实想清楚到底应该对一下两类情况做处理即可:A:清除头结点。B:清除非头节点。
最直观的做法是先把头结点符合val的都删掉,然后再处理后面,即A后B。但是最方便的做法是,做一个dummyNode,即所有的处理都直接使用B即可。

第一次写的时候就是在A以及B这里的处理不停混乱,导致乱七八糟,注意下即可。

2、707.设计链表
你可以选择使用单链表或者双链表,设计并实现自己的链表。

单链表中的节点应该具备两个属性:val 和 next 。val 是当前节点的值,next 是指向下一个节点的指针/引用。

如果是双向链表,则还需要属性 prev 以指示链表中的上一个节点。假设链表中的所有节点下标从 0 开始。

实现 MyLinkedList 类:

MyLinkedList() 初始化 MyLinkedList 对象。
int get(int index) 获取链表中下标为 index 的节点的值。如果下标无效,则返回 -1 。
void addAtHead(int val) 将一个值为 val 的节点插入到链表中第一个元素之前。在插入完成后,新节点会成为链表的第一个节点。
void addAtTail(int val) 将一个值为 val 的节点追加到链表中作为链表的最后一个元素。
void addAtIndex(int index, int val) 将一个值为 val 的节点插入到链表中下标为 index 的节点之前。如果 index 等于链表的长度,那么该节点会被追加到链表的末尾。如果 index 比长度更大,该节点将 不会插入 到链表中。
void deleteAtIndex(int index) 如果下标有效,则删除链表中下标为 index 的节点。

解题:没什么好讲的,多练习一下,链表就熟悉了。假如使用虚拟节点,将会方便很多,大小以及头部增添非常方便,因为代码处理逻辑相同了。
由于在虚拟节点初始化的时候,没有对Size做处理,因此访问第一个虚拟节点,其size依旧是0。
但是对于不同函数,有要注意的地方:
所有的函数遍历指针都由this.dummyHead开始。意味着所有的for循环都是从0开始,但是for循环结束的条件,实际上访问的永远是index-1的节点

  • Get: index小于零,链表为nil以及使用了虚拟节点的size。需要index >= this.Size; 尽管你能够访问,但是访问的是虚拟节点,并不是第一个节点。需要注意
  • AddAtIndex: 注意索引小于0,需要把索引置为0,加入索引大于链表长度的判断。
  • DeleteAtIndex: index小于0,index大于this.Size以及index等于this.Size时需要处理,因为最后一个Index无效(index是从0开始,不是从1开始,而size是从1开始算),其Next是nil,无法继续删除。

3、206.反转链表

题意:反转一个单链表。

示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL

解法:不用递归,按照以下步骤即可:
1.用临时指针tmp记录下一个节点,防止断链。
2.掉头,对current节点的next指针转向到pre。
3.对pre进行更新,更新到current,能够让下一次轮训时访问到当前节点。
4.对current进行更新,把current更新到下一个节点tmp。
一旦顺序搞乱,就会出现断链情况,所以解决办法是先保住链子别断,一步步拆弹。拆完弹之后就进行更新。

6/8更新
要注意一个地方,return的是pre,而不是current,因为current最后被替换成cur.Next后,for的判断是cur !=nil。
最后一个cur = cur.Next,而cur.Next是nil,正向链表的最后一个对象是nil的。因此,返回cur是错误的。
需要返回pre。

1天只能刷Day2和Day3太吃力了,Day4放Day5吧,Day5是周末休息日,刚好补回来。。。。。

  • 23
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值