代码随想录day03

链表理论基础

● 链表是一种通过指针串联在一起的线性结构,每一个节点有两个部分,数据域和指针域,最后一个节点指针域指向null

链表类型

● 单链表
● 双链表
○ 每个节点有两个指针域,一个指向下一个节点,一个是上一个节点
○ 可向前查询或向后查询
● 循环链表
○ 链表首尾相连
○ 可以解决约瑟夫环问题

存储方式

● 在内存中不连续分布,通过指针域连接在内存中的各个节点,散乱分布在内存中的某地址上,分配机制取决于操作系统的内存管理

定义

public class ListNode {int val;ListNode next;ListNode() {}ListNode(int val) { this.val = val; }ListNode(int val, ListNode next) { this.val = val; this.next = next; }}

操作

● 删除
○ 前节点的next指向后节点,Java语言有自己的内存回收机制,不需要手动释放
● 添加
○ 前指我,我指后
● 都是O(1) 不影响其他节点,但注意,遍历查找的时间复杂度是O(n)
性能分析
● 数组插入删除O(n) 查询O(1)
● 链表插入删除O(1) 查询O(n)
● 数组定义的时候,长度固定,不能修改;链表可以动态增删,适合数据量不固定,增删频繁,查询少

203.移除链表元素

● 力扣题目链接
● 题意:删除链表中等于给定值 val 的所有节点。

思路

● 使用虚拟头节点或不使用,时间复杂度O(n) 空间复杂度O(1)
● 递归 时间复杂度O(n) 空间复杂度O(n)

代码

// 设置虚拟头节点
class Solution {public ListNode removeElements(ListNode head, int val) {ListNode dummy = new ListNode(-1, head); // 设置后减少讨论ListNode pre = dummy;while (pre.next != null) {if (pre.next.val == val) { //找到要删除的pre.next = pre.next.next; //删除} else {pre = pre.next; //向后移动}}return dummy.next; //头结点可能被删掉,返回dummy的next即可}
}
// 不设置虚拟头节点
class Solution {public ListNode removeElements(ListNode head, int val) {while (head != null && head.val == val) head = head.next; // 只要头结点要删除,就不断删除if (head == null || head.next == null) return head; // 删除完看是不是空,或只有一个节点,直接返回ListNode temp = head; // 这里temp.val不会是val,且后面有节点while (temp.next != null) {if (temp.next.val == val) temp.next = temp.next.next; // 删除else temp = temp.next;}return head; // 最后返回head即可}
}
// 递归
class Solution {public ListNode removeElements(ListNode head, int val) {if (head == null) return null; // 终止条件head.next = removeElements(head.next, val); // 这个函数的作用是删除节点后返回头结点if (head.val == val) head = head.next; // 最后处理当前逻辑,如果是就删掉,向后移动return head; // 返回头结点}
}

707.设计链表

● 力扣题目链接
● 题意:
● 在链表类中实现这些功能:
○ get(index):获取链表中第 index 个节点的值。如果索引无效,则返回-1。
○ addAtHead(val):在链表的第一个元素之前添加一个值为 val 的节点。插入 后,新节点将成为链表的第一个节点。
○ addAtTail(val):将值为 val 的节点追加到链表的最后一个元素。
○ addAtIndex(index,val):在链表中的第 index 个节点之前添加值为 val 的节点。如果 index 等于链表的长度,则该节点将附加到链表的末尾。如果 index 大于链表长度,则不会插入节点。如果index小于0,则在头部插入节点。
○ deleteAtIndex(index):如果索引 index 有效,则删除链表中的第 index 个节点。

思路

● 难度不大,一点一点分析,注意方法可以复用

代码

class MyLinkedList {private ListNode head;private int size;public MyLinkedList() {head = new ListNode(-1);size = 0;}public int get(int index) {if (index < 0 || index >= size) return -1;ListNode cur = head;while (index-- >= 0) {cur = cur.next;}return cur.val;}public void addAtHead(int val) {addAtIndex(0, val);}public void addAtTail(int val) {addAtIndex(size, val);}public void addAtIndex(int index, int val) {if (index > size) return;ListNode cur = head;while (index-- > 0) {cur = cur.next;}ListNode node = new ListNode(val);node.next = cur.next;cur.next = node;size++;}public void deleteAtIndex(int index) {if (index < 0 || index >= size) return;ListNode cur = head;while (index-- > 0) {cur = cur.next;}cur.next = cur.next.next;size--;}
}class ListNode {int val;ListNode next;public ListNode(){};public ListNode(int val) {this.val = val;}public ListNode(int val, ListNode next) {this.val = val;this.next = next;}
}

206.反转链表

● 力扣题目链接
● 题意:反转一个单链表。

思路

● 使用栈,时间复杂度O(n) 空间复杂度O(n)
● 递归逻辑,注意递归函数的作用,时间复杂度O(n) 空间复杂度O(n)
● 迭代逻辑,时间复杂度O(n) 空间复杂度O(1)

代码

// 使用栈
class Solution {public ListNode reverseList(ListNode head) {Deque<ListNode> stack = new ArrayDeque();while (head != null) {stack.addFirst(head); // 依次把节点入栈head = head.next;}if (stack.isEmpty()) return null; // 栈空,直接返回head = stack.removeFirst(); //先拿到头结点,因为要返回ListNode cur = head; // 使用cur标记while (!stack.isEmpty()) {cur.next = stack.removeFirst(); // 不断弹出节点cur = cur.next;}cur.next = null; // 这个很重要,不然会成环,必须把尾节点的next设为nullreturn head;}
}
// 递归逻辑
class Solution {public ListNode reverseList(ListNode head) { // 1 -> 2 -> 3if (head == null || head.next == null) return head;ListNode newHead = reverseList(head.next); // 3 -> 2 <- 1head.next.next = head; // 3 -> 2 <=> 1head.next = null; // 3 -> 2 -> 1 -> nullreturn newHead;}
}
// 迭代
class Solution {public ListNode reverseList(ListNode head) {if (head == null || head.next == null) return head;ListNode pre = head;ListNode cur = pre.next;ListNode temp;while (cur != null) {temp = cur.next;cur.next = pre;if (pre == head) pre.next = null;pre = cur;cur = temp;}return pre;}
}

35.搜索插入位置(补)

● 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
● 你可以假设数组中无重复元素。

思路

● 和正常的二分查找类似,分析一下应该插入的位置即可

代码

// 左闭右闭写法
class Solution {public int searchInsert(int[] nums, int target) {int l = 0, r = nums.length - 1, m;while (l <= r) {m = (l + r) >>> 1;if (nums[m] < target) l = m + 1;else if (nums[m] > target) r = m - 1;else return m;}return l; // 这个r + 1也可以}
}
// 左闭右开写法
class Solution {public int searchInsert(int[] nums, int target) {int l = 0, r = nums.length, m;while (l < r) {m = (l + r) >>> 1;if (nums[m] < target) l = m + 1;else if (nums[m] > target) r = m;else return m;}return l; // 这个r也可以}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/32234.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

企业级帮助中心编写方案怎么写?

在现代商业环境中&#xff0c;为客户提供高效的支持和解决方案至关重要。企业级帮助中心是一个集中管理和呈现常见问题和解答的平台&#xff0c;可以为客户提供快速、便捷的自助帮助。本文将提供一个企业级帮助中心编写方案&#xff0c;旨在帮助企业提供优质的客户支持&#xf…

【ARM 嵌入式 编译系列 3.1 -- GCC __attribute__((used)) 使用】

文章目录 __attribute__((used)) 属性介绍代码演示编译与输出GCC 编译选项 上篇文章&#xff1a;ARM 嵌入式 编译系列 3 – GCC attribute((weak)) 弱符号使用 下篇文章&#xff1a;ARM 嵌入式 编译系列 3.2 – glibc 学习 __attribute__((used)) 属性介绍 在普通的 C/C 程序中…

20.4 HTML 表单

1. form表单 <form>标签: 用于创建一个表单, 通过表单, 用户可以向网站提交数据. 表单可以包含文本输入字段, 复选框, 单选按钮, 下拉列表, 提交按钮等等. 当用户提交表单时, 表单数据会发送到服务器进行处理.action属性: 应指向一个能够处理表单数据的服务器端脚本或UR…

在SpringBoot项目中使用线程池创建一个线程案例

目录 1. 首先,在你的Spring Boot项目的配置类中,创建一个`ThreadPoolTaskExecutor`的Bean:2. 在你的Service类中,创建一个异步方法,并使用`@Async`注解将其标记为异步方法,该方法将在线程池中执行:3. 在Controller中调用异步方法:在Spring Boot项目中使用线程池可以通过…

React入门学习笔记3

事件处理 通过onXxx属性指定事件处理函数(注意大小写) React使用的是自定义(合成)事件, 而不是使用的原生DOM事件——为了更好的兼容性 eg&#xff1a;οnclick》onClickReact中的事件是通过事件委托方式处理的(委托给组件最外层的元素)——为了更高效通过event.target得到发生…

【Express.js】软件测试

软件测试 本节介绍如何在 express.js 使用 Jest 进行单元测试 准备工作 准备一个基础的 express 项目&#xff0c;本文基于 evp-express-cli安装 Jest npm install jest --save-dev生成 Jest 配置 npx jest --init编写测试 创建测试文件&#xff0c;以 .test.js 后缀命名…

AlmaLinux 9 安装 Go 1.20

AlmaLinux 9 安装 Golang 1.20 1. 下载 go 安装包2. 安装 go3. 配置环境变量4. 确认 go 版本 1. 下载 go 安装包 访问 https://go.dev/dl/&#xff0c;下载你想安装的版本&#xff0c;比如 go1.20.7.linux-amd64.tar.gz&#xff0c; 2. 安装 go (可选)删除旧版本&#xff0c;…

CLIP论文精度

CLIP论文精度 Zero-shot CLIP多模态模型 Image Endecoder是一个图片编码器&#xff0c;既可以是ResNet,也可以是Vision Transformer. Text Encoder和Image Encoder产生的两组特征进行对比学习&#xff08;无监督训练&#xff09; 分类头&#xff1f;“分类头” 是指网络结…

matlab使用教程(13)—稀疏矩阵创建和使用

使用稀疏矩阵存储包含众多零值元素的数据&#xff0c;可以节省大量内存并加快该数据的处理速度。sparse 是一种属性&#xff0c;可以将该属性分配给由 double 或 logical 元素组成的任何二维 MATLAB 矩阵。通过 sparse 属性&#xff0c;MATLAB 可以&#xff1a; • 仅存储矩…

openGauss学习笔记-37 openGauss 高级数据管理-事务

文章目录 openGauss学习笔记-37 openGauss 高级数据管理-事务37.1 语法格式37.2 参数说明37.3 示例 openGauss学习笔记-37 openGauss 高级数据管理-事务 事务是用户定义的一个数据库操作序列&#xff0c;这些操作要么全做要么全不做&#xff0c;是一个不可分割的工作单位。ope…

SpringBoot案例-部门管理-删除

目录 查看页面原型&#xff0c;明确需求 页面原型 需求 阅读接口文档 思路分析 功能接口开发 控制层&#xff08;Controllre类&#xff09; 业务层&#xff08;Service类&#xff09; 持久层&#xff08;Mapper类&#xff09; 接口测试 前后端联调 查看页面原型&a…

全面讲解|DCMM数据管理能力成熟度及各地政策汇总

信息技术与经济社会的交汇融合引发了数据爆发式增长。数据蕴含着重要的价值&#xff0c;已成为国家基础性战略资源&#xff0c;正日益对全球生产、流通、分配、消费活动以及经济运行机制、社会生活方式和国家治理能力产生重要影响。数据价值发挥的前提是管理好数据&#xff0c;…

docker 学习笔记 (持续更新)

一些基础概念 Docker 入门教程 - 阮一峰的网络日志 什么是image文件&#xff1f; Docker 把应用程序及其依赖&#xff0c;打包在 image 文件里面。只有通过这个文件&#xff0c;才能生成 Docker 容器。image 文件可以看作是容器的模板。Docker 根据 image 文件生成容器的实例。…

13_Ansible role、创建目录结构、Roles依赖关系;Playbook参考资料:facts、with_item、jinja模板、role角色

16.Ansible role 16.1.Ansible Roles介绍 16.2.创建目录结构 16.3.Ansible Roles依赖关系 17.其它参考资料 17.1.Playbook参考资料 17.2.Ansible facts 17.3.判断语句 when 17.4.with_items 17.5.ansible jinja模板 17.6.ansible role角色 17.7.变量其它参考文档 16.Ansible r…

【Codeforces】 CF1734E Rectangular Congruence

题目链接 CF方向 Luogu方向 题目解法 暂时不考虑 b i b_i bi​ 的限制 考虑构造 a i , j i j a_{i,j}ij ai,j​ij&#xff0c; 那么 a r 1 , c 1 a r 2 , c 2 r 1 c 1 r 2 c 2 , a r 1 , c 2 a r 1 , c 2 r 1 c 2 r 2 c 1 a_{r1,c1}a_{r2,c2}r1c1r2c2,\;a_{r1,c2}…

设计模式(5)代理模式

一、介绍&#xff1a; 【Subject/抽象角色】定义了RealSubject和Proxy的共用接口&#xff0c;这样就可以在任何使用RealSubject的地方都可以使用Proxy 【RealSubject/真实角色】定义Proxy所代表的真实实体 【Proxy/代理角色】保存一个引用使得代理可以访问实体&#xff0c;并…

题目:2319.判断矩阵是否是 X 矩阵

​​题目来源&#xff1a; leetcode题目&#xff0c;网址&#xff1a;2319. 判断矩阵是否是一个 X 矩阵 - 力扣&#xff08;LeetCode&#xff09; 解题思路&#xff1a; 遍历矩阵&#xff0c;对于每一个节点&#xff0c;先判断是否处于主对角线或副对角线上&#xff0c;然后判…

LVGL学习笔记 28 - 键盘keyboard

目录 1. 设置关联文本框 2. 设置模式 2.1 LV_KEYBOARD_MODE_TEXT_LOWER 2.2 LV_KEYBOARD_MODE_TEXT_UPPER 2.3 LV_KEYBOARD_MODE_SPECIAL 2.4 LV_KEYBOARD_MODE_NUMBER 2.5 LV_KEYBOARD_MODE_USER_1 ~ LV_KEYBOARD_MODE_USER_4 3. 使能弹窗模式 4. 更改按键布局 5. 事…

后台管理系统

1.1 项目概述 简易后台管理系统是一个基于Vue3ElemrntPlus的后台管理系统&#xff0c;提供了用户登录、记住密码、数据的增删改查、分页、错误信息提示等功能&#xff0c;旨在协助管理员对特定数据进行管理和操作。 没有后台对接&#xff0c;数据源为假数据。 全部代码已上传G…