System.out.println(slow.val);
return slow;
}
}
四、删除链表中所有给定值val的节点(Leetcode.203 移除链表元素)
==========================================================================================================
给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。
题解:定义一个前驱节点
public ListNode removeElements(ListNode head, int val) {
if(head==null)return null;
ListNode cur=head.next;
ListNode prev=head;
//遍历单链表的每一个节点
while (cur!=null){
if(cur.val==val){//这是你要删除的节点
prev.next=cur.next;//将下一个地址值赋给prev
cur=cur.next;
}else{//不是删除的节点
prev=prev.next;
cur=cur.next;
}
}if(head.val==val){//如果头节点也是要删除的节点
head=head.next;
}
return head;
}
=============================================================================
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
public class Solution {
public ListNode deleteDuplication(ListNode pHead){
ListNode tmpHead=new ListNode(-1);//定义傀儡节点
ListNode cur=pHead;
ListNode newHead=tmpHead;//防止头节点也是被删除的节点
while (cur!=null){
if(cur.next!=null&&cur.val==cur.next.val){//值相同的情况
while (cur.next!=null&&cur.val==cur.next.val){
cur=cur.next;
}
cur=cur.next;
}else {//
tmpHead.next=cur;
tmpHead=tmpHead.next;
cur=cur.next;
}
}
tmpHead.next=null;//防止最后一个节点也是要删除的节点
return newHead.next;
}
}
==============================================================================
给一定值x,编写一段代码将所有小于x的结点排在其余结点之前,且不能改变原来的数据顺序,返回重新排列后的链表的头指针。
题解 定义小于x的头指针和尾指针 定义大于x的头指针和尾指针
之后考虑特殊情况 全部都是大于x的就返回as,还有最后一个节点不是大于x的,会放到小于x的里面,会导致ae.next!=null,需要将其置null;
public class Partition {
public ListNode partition(ListNode pHead, int x) {
ListNode bs=null;//比x小的节点的头
ListNode be=null;//比x小的节点的尾
ListNode as=null;//比x大的节点的头
ListNode ae=null;//比x大的节点的尾
ListNode cur=pHead;
while(cur!=null){
if(cur.val<x){//比x小的值 不能改变原来的顺序就用尾插法
if(bs==null){//第一次插入
bs=cur;
be=cur;
}else {//非第一次插入
be.next=cur;
be=be.next;
}
}
else {//比x大的值
if(as==null){//第一次插入
as=cur;
ae=cur;
}else {//非第一次插入
ae.next=cur;
ae=ae.next;
}
}
cur=cur.next;
}
if(bs==null){//第一个链表没有数据
return as;
}
be.next=as;
if(as!=null){//防止最后一个节点.next不是null
ae.next=null;
}
return bs;
}
}
============================================================================
链表的回文结构 就是正反看都是一样的 例如1 2 3 2 1 .找到链表的中间位置 ,之后反转后半部分链表 比较 (分为奇偶节点比较)
public class PalindromeList {
public boolean chkPalindrome(ListNode head) {
if(head==null){return false;}
if(head.next==null){return true;}
ListNode fast=head;//定义快慢指针寻找中间节点
ListNode slow=head;
while(fast!=null&&fast.next!=null){
fast=fast.next.next;
slow=slow.next;
}
ListNode cur=slow.next;//找到中间节点 反转链表
while(cur!=null){//反转链表
ListNode curNext=cur.next;
cur.next=slow;
slow=cur;
cur=curNext;
}
while(head!=slow){
if(head.val!=slow.val){
return false;
}
if(head.next==slow){
return true;
}
head=head.next;
slow=slow.next;
}
return true;
}
}
================================================================================================
如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。
如果链表中存在环,则返回 true 。 否则,返回 false 。
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)
Ending
Tip:由于文章篇幅有限制,下面还有20个关于MySQL的问题,我都复盘整理成一份pdf文档了,后面的内容我就把剩下的问题的目录展示给大家看一下
如果觉得有帮助不妨【转发+点赞+关注】支持我,后续会为大家带来更多的技术类文章以及学习类文章!(阿里对MySQL底层实现以及索引实现问的很多)
吃透后这份pdf,你同样可以跟面试官侃侃而谈MySQL。其实像阿里p7岗位的需求也没那么难(但也不简单),扎实的Java基础+无短板知识面+对某几个开源技术有深度学习+阅读过源码+算法刷题,这一套下来p7岗差不多没什么问题,还是希望大家都能拿到高薪offer吧。
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
MySQL底层实现以及索引实现问的很多)
[外链图片转存中…(img-ZzTfazVf-1712583125060)]
[外链图片转存中…(img-6TYM4X1b-1712583125060)]
吃透后这份pdf,你同样可以跟面试官侃侃而谈MySQL。其实像阿里p7岗位的需求也没那么难(但也不简单),扎实的Java基础+无短板知识面+对某几个开源技术有深度学习+阅读过源码+算法刷题,这一套下来p7岗差不多没什么问题,还是希望大家都能拿到高薪offer吧。
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!