Java解析剑指Offer链表篇(1)
目录
一、移除链表元素
1、题目要求
2、基本思路
3、代码演示
二、反转链表
1、题目要求
2、基本思路
3、代码实现
三、链表的中间结点
1、题目要求
2、基本思路
3、代码实现
四、链表中倒数第k个结点
1、题目要求
2、基本思路
3、代码演示
一、移除链表元素
1、题目要求
给你一个链表的头节点 head
和一个整数 val
,请你删除链表中所有满足 Node.val == val
的节点,并返回 新的头节点 。
203. 移除链表元素 - 力扣(LeetCode)
2、基本思路
首先建立两个结点,一个为cur,一个为perv,perv这个结点用来连接与val不相同的数,因此perv从Head开始,而cur的任务是去排除与val相同的数,如下图:
假如cur.val == val,则这个结点不符合要求,跳过这个结点,cur = cur.next,perv结点不动,直到cur结点发现cur.val != val,那么perv的结点指向cur,也就是perv.next = cur。就这样循环直到cur遍历完整个链表,也就是cur == null 。
但是还有一种情况需要我们思考,就是假如,Head.val == val我们该怎么办 ?
这个很简单,因为经过的刚刚perv和cur结点的帮忙,我们以及得到了除了Head.val没有判断是否与val相同其他结点都!=val的链表,所以到最后我们可以利用if语句来判断假如Head.val == val,那么Head = Head.next即可。
3、代码演示
class Solution {public ListNode removeElements(ListNode head, int val) {if(head == null){return null;}ListNode perv = head;ListNode cur = head.next;while(cur != null){if(cur.val == val){perv.next = cur.next;cur = cur.next;}else{perv = cur;cur = cur.next;}}if(head.val == val){head = head.next;}return head;}
}
二、反转链表
1、题目要求
给你单链表的头节点 head
,请你反转链表,并返回反转后的链表。
206. 反转链表 - 力扣(LeetCode)
2、基本思路
首先我们还需要建立两个结点,一个结点为perv,另外一个cur,perv作为我们反转链表之后的头结点,因此刚刚开始我们应该把他定义为null,而cur主要作为哨兵结点,用来反转链表,因此我们将它从Head开始
我们只需要考虑一次两个链表反转的过程其他直接交给循环就好了,因此首先我们得引用一个新的结点来保存cur.next,因为后续反转链表cur.next会变成perv,不保存的话会导致后面的链表丢失,然后将cur.next = perv,然后再将perv = cur ,cur只想下一个结点,准备下一次的反转。这样就反转好了一个链表中的前后结点。
接下来只需考虑循环,当cur == null的时候也就意味着整个链表遍历完毕,也就是整个链表反转完成,我们直接返回perv结点即可。
3、代码实现
class Solution {public ListNode reverseList(ListNode head) {if(head == null){return null;}ListNode perv = null;ListNode cur = head;while(cur != null){ListNode curNext = cur.next;cur.next = perv;perv = cur;cur = curNext;}return perv;}
}
三、链表的中间结点
1、题目要求
给定一个头结点为 head
的非空单链表,返回链表的中间结点。
如果有两个中间结点,则返回第二个中间结点。
876. 链表的中间结点
2、基本思路
因为需要返回中间结点,也就是整个链表位于中间位置的元素,因此也就是sizeNodeList/2位置的元素,有一种很暴力的方法也就是遍历一次链表,得到链表的长度,然后在/2,得到了目标数的指定位置,然后我们在遍历一遍链表返回所得结点,这样看太过于暴力,我们需要思考如何通过一次遍历链表就可以得到我们想要的东西呢?
众所周知,假如一个物体A是另一个物体B速度的二倍,则在相同时间内,A行驶的路程也是B的二倍,有了这个思路,这个题也就迎刃而解了,我们可以设置两个结点一个为fast,一个为low,fast结点为low结点遍历的二倍,这样当fast == null并且 fast.next == null 的时候,low结点也就刚好到了中间,我们直接返回就好。
3、代码实现
class Solution {public ListNode middleNode(ListNode head) {if(head == null){return null;}ListNode fast = head;ListNode low = head;while(fast != null&& fast.next != null){fast = fast.next.next;low = low.next;}return low;}
}
四、链表中倒数第k个结点
1、题目要求
输入一个链表,输出该链表中倒数第k个结点
链表中倒数第k个结点_牛客题霸_牛客网 (nowcoder.com)
2、基本思路
这个题,大多数的人想法都是使用暴力的方法来直接获得我们想得到的东西,但是太过于麻烦,,这个题我们依旧可以只遍历一次链表从而得到我们想要的东西。
首先我们需要定义两个结点,一个fast,一个low ,fast首先从链表的head开始往后走k - 1,这时候low保持不变
这样他们两之间就存在了差距,然后我们的fast与low开始同步前进,当我们的fast走到了最后时,也就是走到了 链表的尾巴,因为我们low和fast之间有差距,因为这个差距是根据他需要倒数第k个结点决定的,因此我们的low也就理所应当的成为了我们最后想要得到的结果。
注意!!我们需要考虑K的大小问题,假如K<=0,则说明不存在,或者K >= sizeNodeList时,但是问题来了,我们不知道链表长度啊,我们该怎么办呢?
在我们在fast结点的时候我们就可以判断这个条件,我们在建立差距的时候,fast == null,则说明这个K超出范围。 这样就解决了这个问题。
3、代码演示
public class Solution {public ListNode FindKthToTail(ListNode head,int k) {if(head == null|| k <= 0){return null;}ListNode fast = head;ListNode low = head;while(k - 1 != 0){fast = fast.next;if(fast == null){return null;}k--;}while(fast.next != null){fast = fast.next;low = low.next;}return low;}
}
Java解析剑指Offer链表篇(1)相关推荐
- Java算法:牛客网Java版剑指Offer全套算法面试题目整理及电子档,Java算法与数据结构面试题,面试刷题、背题必备!牛客网剑指offer
剑指offer(java版) 牛客网Java版剑指Offer全套题目67道 资源来源于网络 目录 1.二维数组中的查找 2.替换空格 3.从尾到头打印链表 4.重建二叉树 5.用两个栈实现队列 6.旋 ...
- 递增的整数序列链表的插入_每日算法题 | 剑指offer 链表专题 (5)链表中倒数第k个节点...
点击上方"Jerry的算法和NLP",选择"星标"公众号 重磅干货,第一时间送达 题目 链表中倒数第k个节点 题目要求 输入一个链表的头结点,从尾到头反过来打印 ...
- 【Java】 剑指offer(36) 二叉搜索树与双向链表
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不 ...
- 【剑指offer】【leetcode精选题集】【Java】剑指offer题解合集 更新中
Leetcode题集 [剑指offer][JAVA]面试题第[03]题[数组中的重复数字][HashSet] [剑指offer][JAVA]面试题第[04]题[二维数中的查找][数组] [剑指offe ...
- java求最后一位不为0的数字_【Java】 剑指offer(62) 圆圈中最后剩下的数字
本文参考自<剑指offer>一书,代码采用Java语言. 题目 0, 1, -, n-1这n个数字排成一个圆圈,从数字0开始每次从这个圆圈里删除第m个数字.求出这个圆圈里剩下的最后一个数字 ...
- java 滑动窗口_【Java】 剑指offer(59-1) 滑动窗口的最大值
本文参考自<剑指offer>一书,代码采用Java语言. 题目 给定一个数组和滑动窗口的大小,请找出所有滑动窗口里的最大值.例如,如果输入数组{2, 3, 4, 2, 6, 2, 5, 1 ...
- 【Java】 剑指offer(40) 最小的k个数
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 输入n个整数,找出其中最小的k个数.例如输入4.5.1.6.2.7 ...
- java 加法不用_【Java】 剑指offer(65) 不用加减乘除做加法
本文参考自<剑指offer>一书,代码采用Java语言. 题目 写一个函数,求两个整数之和,要求在函数体内不得使用+.-.×.÷四则运算符号. 思路 对数字做运算,除了四则运算外,只剩下位 ...
- 【Java】 剑指offer(28) 对称的二叉树
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 请实现一个函数,用来判断一棵二叉树是不是对称的.如果一棵二叉树和它 ...
最新文章
- java flex 图片上传_flex上传图片到java服务器
- 华科发布报告:41%研究生学霸是单身!
- linux环境下java开发_Linux Ubuntu系统下Java开发环境搭建
- 几年前的代码发现一个BUG: 整数相除结果不能默认转换为浮点数
- 登陆状态购物车数据结构
- oracle 查询时间点数据_oracle统计时间段内每一天的数据(推荐)
- Python之网络编程(基于tcp实现远程执行命令)
- .Net MVC框架 + WCF 搭建 集群开发
- Page Cache与Page回写
- unity3D游戏素材素材哪家强?Top3都在这!
- 北京市公布533家接种点名单 (zz)
- 大话 Redis 数据结构
- 虎牙直播怎么换html5,虎牙直播怎么换徽章-虎牙直播更换粉丝徽章的方法 - 河东软件园...
- valid ready协议学习
- 手绘图解:从零维到十维空间
- 【蓝桥杯选拔赛真题01】Scratch消失的小猫 少儿编程scratch蓝桥杯选拔赛真题讲解
- 电子器件系列十四:缓冲器
- 涉密计算机维修管理台账,涉密表格格台账.doc
- Roxio MyDVD(DVD制作软件)v3.0.0.8中文版
- elementui table 第一列内容相同 自动合并单元格 el-table第一列内容相同自动合并