news 2026/6/2 12:13:47

leecodecode【反前后指针】【2026.5.31打卡-java版本】

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
leecodecode【反前后指针】【2026.5.31打卡-java版本】

删除链表中的节点

要点:node.val = node.next.val

/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */ class Solution { public void deleteNode(ListNode node) { node.val = node.next.val; node.next = node.next.next; } }

删除链表的倒数第 N 个结点

要点:

方法1:记录length,然后减掉n,找到n的前一个节点,不用dummy的话,就特判一下头节点

/** * Definition for singly-linked list. * 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; } * } */ class Solution { public ListNode removeNthFromEnd(ListNode head, int n) { //记录长度 ListNode temp1 = head; int length = 0; while(temp1 != null){ length++; temp1 = temp1.next; } int target = length - n; if(target == 0){ return head.next; } ListNode dummy = new ListNode(-1, head); ListNode temp2 = dummy.next; for(int i = 1; i < target; i++){ temp2 = temp2.next; } temp2.next = temp2.next.next; return dummy.next; } }

方法2:dummy。left。right,right先走n,然后right到last的时候,left在倒数n+1节点上

/** * Definition for singly-linked list. * 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; } * } */ class Solution { public ListNode removeNthFromEnd(ListNode head, int n) { ListNode dummy = new ListNode(0,head); ListNode left = dummy; ListNode right = dummy; while(n-- > 0){ right = right .next; } while(right.next != null){ right = right.next; left = left.next; } left.next = left.next.next; return dummy.next; } }

删除排序链表中的重复元素

要点:cur,然后对比cur.next

/** * Definition for singly-linked list. * 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; } * } */ class Solution { public ListNode deleteDuplicates(ListNode head) { if(head == null){ return head; } ListNode cur = head; while(cur.next != null){ if(cur.next.val == cur.val){ cur.next = cur.next.next; }else{ cur = cur.next; } } return head; } }

删除排序链表中的重复元素 II

要点:需要dummy,cur.next 和cur.next,next

/** * Definition for singly-linked list. * 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; } * } */ class Solution { public ListNode deleteDuplicates(ListNode head) { //需要哨兵节点,因可能删除头节点 ListNode dummy = new ListNode(-1, head); ListNode cur = dummy; while(cur.next != null && cur.next.next != null){ int val = cur.next.val; if(cur.next.next != null && cur.next.next.val == val){ while(cur.next != null && cur.next.val == val){ cur.next = cur.next.next; } }else{ cur = cur.next; } } return dummy.next; } }

随机知识

JVM内存模型-JVM 运行时数据区有哪些?各自放什么?

候选人
好的,JVM 运行时数据区是 Java 程序运行的内存基础,一共分为五个核心区域。我按线程共享线程私有分成两类来说。

先总览整体架构

线程共享的有两块:方法区。线程私有的有三块:虚拟机栈本地方法栈程序计数器

线程私有的意思是每个线程都有一份独立的内存空间,线程结束自动释放,互不干扰。线程共享的意思是所有线程都能访问同一块内存,这也是多线程并发问题产生的根源。

逐一详解五个区域

第一,堆。堆是 JVM 内存中最大的一块,所有通过new创建出来的对象和数组都分配在堆上。它是垃圾回收器重点管理的区域,所以也叫做“GC 堆”。堆里保存的是每个对象的实例数据,比如一个 Person 对象里 name 和 age 的具体值。堆是线程共享的,所有线程都可以访问堆里的对象。因为堆里对象生命周期复杂,有朝生夕死的,也有长期存活的,所以现在 JVM 把堆逻辑上分成年轻代和老年代,分别用不同的垃圾回收策略处理。

第二,方法区。方法区存放的是类的元信息,也就是类被加载后 JVM 需要记录的结构性数据,包括类的版本、字段、方法、接口、静态变量、常量池,还有即时编译器编译后的代码缓存。它也是线程共享的。JDK7 及之前,方法区的实现在堆里,叫永久代,大小固定,容易 OOM。JDK8 开始,方法区的实现移到了本地内存里,改叫元空间,大小默认不限制,只受物理内存限制,更灵活,也减少了堆的 GC 压力。经常聊的“运行时常量池”也在方法区里,字符串常量池在 JDK7 时被移到了堆里,因为堆比永久代空间大,GC 更积极,可以减少 OOM。

第三,虚拟机栈。每个线程启动时,JVM 会给它分配一个独立的虚拟机栈。栈里存的不是对象,而是一个一个的栈帧。每调用一个方法,就创建一个栈帧压入栈顶,方法执行完,栈帧弹出。栈帧里主要存三类数据:一是局部变量表,存放方法内部定义的局部变量,包括基本类型的值和对象的引用(对象本身在堆里,栈里只存指向堆的指针);二是操作数栈,JVM 执行字节码指令时用于计算的中间数据暂存区域;三是返回值等信息。栈内存由 JVM 自动管理,方法结束栈帧弹出,内存就释放了。如果方法递归调用次数过多,栈帧撑满整个栈,就会抛出 StackOverflowError。

第四,本地方法栈。它和虚拟机栈结构类似,但服务对象不同。虚拟机栈为 Java 方法服务,本地方法栈为 Native 方法服务,也就是 Java 调用底层 C/C++ 写的操作系统接口时使用。比如Thread.start()底层创建操作系统线程,就会用到本地方法栈。

第五,程序计数器。它是五块内存中最小的,每个线程都有一个独立的程序计数器。它只记录一个信息:当前线程正在执行的字节码指令的行号。CPU 在多线程间来回切换执行,每次切回来的时候,线程必须知道“上一轮我执行到哪一行了”,这就是程序计数器的意义。这个区域是 JVM 规范中唯一没有规定任何 OutOfMemoryError 的区域。

用一句代码把五个区域串起来

String s = new String("hello")这句代码来说:

  • s这个引用变量在虚拟机栈的局部变量表里。
  • new String("hello")这个对象实例分配在堆里。
  • String这个类的元信息(类名、有哪些方法、字段)存放在方法区里。
  • 执行这行代码时,当前线程执行到第几行由程序计数器记录。
  • 如果在 Native 方法中创建对象,本地方法栈会参与进来。

这样就能把五个区域和日常写代码的变量、对象、类信息一一对上。

碎碎念:后续会更新每天学习的八股和算法 题,开始准备秋招的第21天。努力连续更新100天!以后每天就按,秋招项目【java+agent】,科研,必做项目,算法,八股,锻炼身体来总结。

总结:今天效率巨低,还是算法题及时反馈感强,不想学其他的,不行!以后要以程序员为职业,首先就是要热爱代码呀!!!!!加油加油加油

1.算法要系统过一遍【灵神】8/27【晚上】2h

2.秋招项目,【java】开始实际看业务,2.9/10;无

【agent】还在学,决定把helloagent看一遍,5/16;无

3.科研要跑一下,无

4.检测项目也得总结文档,无,

5.训练项目看看先选择好,无,

6.背八股,无

7.锻炼身体,无

反思:昨天玩手机起得太晚,周末一点不想学习,自己规划的太不合理,当你熬夜的时候就应该知道今天完不成任务,安排事情应该要往前看两步,一天真正清醒的时间很少的呀。

这周相当于啥也没干。

第三周总结改进

1:不要熬夜,不要向明天借时间,今天的事情今天就要干完。

2.运动不能停止

3.相信自己,增强对时间的把控力,

4.得每天看点面经还是,保持状态

5.脑子动起来,感觉现在脑子特别笨,看点脑筋急转弯
————————————————

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/2 12:13:04

基于ESP-NOW与WS2812B的无线智能RGB灯DIY全解析

1. 项目概述&#xff1a;打造一个无需路由器的智能RGB灯在捣鼓智能家居和物联网项目时&#xff0c;我们常常会遇到一个两难的选择&#xff1a;要么依赖Wi-Fi路由器&#xff0c;设备一多网络就拥堵&#xff0c;延迟也不稳定&#xff1b;要么用蓝牙&#xff0c;距离又太近&#x…

作者头像 李华
网站建设 2026/6/2 12:11:43

第十三周笔记

完成了下一块的部分仿真首先模拟杂波&#xff0c;通过低通滤波器和隔直流&#xff0c;滤除10khz杂波&#xff0c;留下1khz经过放大电路&#xff0c;将电路放大十倍利用滞回比较器&#xff0c; R4 R6 构成反馈网络&#xff0c;给比较器设置了两个不同的翻转阈值&#xff08;上门…

作者头像 李华
网站建设 2026/6/2 12:06:57

大文件同步与协同办公优选:2026主流高安全性企业云盘全景盘点

在数字化办公深度普及的 2026 年&#xff0c;企业共享网盘已不再仅仅是“云端 U 盘”&#xff0c;而是企业数据资产管理的核心引擎。面对海量数据存储与复杂权限控管的双重需求&#xff0c;如何选出一款既能提供海量空间&#xff0c;又能保障极端安全的方案&#xff1f;本文深度…

作者头像 李华
网站建设 2026/6/2 12:04:22

避坑指南:STM32标准库配置ADC扫描+DMA,这几个顺序和标志位千万别搞错

STM32标准库ADC扫描DMA配置避坑实战手册 第一次接触STM32的ADC扫描模式配合DMA传输时&#xff0c;我按照教程一步步配置&#xff0c;结果数据不是错位就是DMA根本不工作。调试了整整两天才发现&#xff0c;问题出在几个关键标志位的使能顺序上——这个教训让我意识到&#xff0…

作者头像 李华