目录

一、移除链表元素

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)相关推荐

  1. Java算法:牛客网Java版剑指Offer全套算法面试题目整理及电子档,Java算法与数据结构面试题,面试刷题、背题必备!牛客网剑指offer

    剑指offer(java版) 牛客网Java版剑指Offer全套题目67道 资源来源于网络 目录 1.二维数组中的查找 2.替换空格 3.从尾到头打印链表 4.重建二叉树 5.用两个栈实现队列 6.旋 ...

  2. 递增的整数序列链表的插入_每日算法题 | 剑指offer 链表专题 (5)链表中倒数第k个节点...

    点击上方"Jerry的算法和NLP",选择"星标"公众号 重磅干货,第一时间送达 题目 链表中倒数第k个节点 题目要求 输入一个链表的头结点,从尾到头反过来打印 ...

  3. 【Java】 剑指offer(36) 二叉搜索树与双向链表

    本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不 ...

  4. 【剑指offer】【leetcode精选题集】【Java】剑指offer题解合集 更新中

    Leetcode题集 [剑指offer][JAVA]面试题第[03]题[数组中的重复数字][HashSet] [剑指offer][JAVA]面试题第[04]题[二维数中的查找][数组] [剑指offe ...

  5. java求最后一位不为0的数字_【Java】 剑指offer(62) 圆圈中最后剩下的数字

    本文参考自<剑指offer>一书,代码采用Java语言. 题目 0, 1, -, n-1这n个数字排成一个圆圈,从数字0开始每次从这个圆圈里删除第m个数字.求出这个圆圈里剩下的最后一个数字 ...

  6. java 滑动窗口_【Java】 剑指offer(59-1) 滑动窗口的最大值

    本文参考自<剑指offer>一书,代码采用Java语言. 题目 给定一个数组和滑动窗口的大小,请找出所有滑动窗口里的最大值.例如,如果输入数组{2, 3, 4, 2, 6, 2, 5, 1 ...

  7. 【Java】 剑指offer(40) 最小的k个数

    本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 输入n个整数,找出其中最小的k个数.例如输入4.5.1.6.2.7 ...

  8. java 加法不用_【Java】 剑指offer(65) 不用加减乘除做加法

    本文参考自<剑指offer>一书,代码采用Java语言. 题目 写一个函数,求两个整数之和,要求在函数体内不得使用+.-.×.÷四则运算符号. 思路 对数字做运算,除了四则运算外,只剩下位 ...

  9. 【Java】 剑指offer(28) 对称的二叉树

    本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 请实现一个函数,用来判断一棵二叉树是不是对称的.如果一棵二叉树和它 ...

最新文章

  1. java flex 图片上传_flex上传图片到java服务器
  2. 华科发布报告:41%研究生学霸是单身!
  3. linux环境下java开发_Linux Ubuntu系统下Java开发环境搭建
  4. 几年前的代码发现一个BUG: 整数相除结果不能默认转换为浮点数
  5. 登陆状态购物车数据结构
  6. oracle 查询时间点数据_oracle统计时间段内每一天的数据(推荐)
  7. Python之网络编程(基于tcp实现远程执行命令)
  8. .Net MVC框架 + WCF 搭建 集群开发
  9. Page Cache与Page回写
  10. unity3D游戏素材素材哪家强?Top3都在这!
  11. 北京市公布533家接种点名单 (zz)
  12. 大话 Redis 数据结构
  13. 虎牙直播怎么换html5,虎牙直播怎么换徽章-虎牙直播更换粉丝徽章的方法 - 河东软件园...
  14. valid ready协议学习
  15. 手绘图解:从零维到十维空间
  16. 【蓝桥杯选拔赛真题01】Scratch消失的小猫 少儿编程scratch蓝桥杯选拔赛真题讲解
  17. 电子器件系列十四:缓冲器
  18. 涉密计算机维修管理台账,涉密表格格台账.doc
  19. Roxio MyDVD(DVD制作软件)v3.0.0.8中文版
  20. elementui table 第一列内容相同 自动合并单元格 el-table第一列内容相同自动合并

热门文章

  1. 放大器构成电压跟随器 proteus仿真 TLV2252
  2. [开源]Winform程序-Fav2Html
  3. 推荐一些有趣的编程书籍和电影
  4. 刘振飞:做云计算比保障双十一要难得多
  5. SAP ABAP MIGO 262
  6. 备忘录模式,徐长卿的三世记忆
  7. 百度文库----免费复制
  8. android立体3D效果_PS教程:铝膜气球字制作的完整教程,3D立体效果字体的制作...
  9. 什么是Category
  10. 你了解DSP芯片的发展吗?DSP芯片有哪些应用?