转载注明!!https://blog.csdn.net/qq_31842777/article/details/90632307
涉及以下问题:

  1. 查找倒数第k个结点;
  2. 查找中间结点;
  3. 判断链表是否有环;
  4. 计算环的长度;
  5. 计算环的入口结点,原理参见(s含快慢指针推导):https://blog.csdn.net/puss0/article/details/78462375;
  6. 计算两个链表的第一个公共结点(Y型),原理参见:https://blog.csdn.net/yanxiaolx/article/details/52132435

直接上代码:

import java.util.Stack;
public class MyLinkedList {//定义头结点public  Node head;//定义结点类public static class Node{//类必须是static,后面测试会用到此类创建实例int data;Node next;Node(){}Node(int data){this.data=data;}}/**以下是表的基本操作 *///添加结点,以创建链表  遍历链表到尾结点,然后添加结点public void addNode(Node node) {Node temp=head;//以下操作找到链表的尾结点,然后插入while(temp.next!=null) {temp=temp.next;}//如果temp.next为空,即到尾结点,加入新结点temp.next=node;}//获取链表长度 从头遍历链表public static int getLength(Node head) {if(head==null) {return 0;}Node temp=head;int length=1;while(temp.next!=null) {length++;temp=temp.next;}return length;}/*** 快慢指针的使用及相关算法题*///1.查找倒数第k个结点/** 思路:第一种,直接查找第length-k个结点;* 第二种,快慢指针,初始都指在同一个结点,然后快指针走k-1步,然后快慢指针同时走,直到快指针到达尾结点,返回慢指针* 如:链表1,2,3,4, 查找倒数第3个,快慢指针指在1,快指针走k-1=2步,到3,快慢指针同时走,一步后快指针到尾结点,慢指针找到倒数第三个,即2*/public Node queryByIndex(int index) {if(head==null||index<1||index>getLength(head)) {//注意这里的temp!=null条件,非常重要,因为temp.next!=null会忽略最后一个结点return null;}Node slow=head;Node quick=head;Node temp=head;int step=0;while(temp.next!=null||temp!=null) {//快指针走k-1步if((index-1)==step++) {quick=temp;}temp=temp.next;}//快慢指针同时走while(quick.next!=null) {slow=slow.next;quick=quick.next;}return slow;}//2.查找中间结点/** 快慢指针,初始指在同一个结点,快指针每走两步,慢指针走一步,快指针到尾结点,返回慢指针*/public static Node getMidNode(Node head) {if(head==null) {return null;}if(head.next==null) {return head;}Node quick=head;Node slow=head;while(slow.next!=null&&quick.next!=null&&quick.next.next!=null) {quick=quick.next.next;slow=slow.next;}return slow;}//3.判断是否有环/** 快慢指针,初始指在同一节点,快指针走两步,慢指针走一步,直到快慢指针的data相等,返回true,证明有环*/public boolean hasLoop(Node head) {if(head==null||head.next==null) {return false;}Node quick=head;Node slow=head;while(slow.next!=null&&quick.next!=null&&quick.next.next!=null) {if(slow.data==quick.data) {return true;}quick=quick.next.next;slow=slow.next;}return false;}//4.确定环的长度/** 快慢指针,初始指在同一节点,快指针走两步,慢指针走一步,直到快慢指针的data相等 * 返回快指针走的长度-慢指针走的长度,就是环的长度*/public static int getLoopLength(Node head) {Node quick=head;Node slow=head;int quickSteps=0;int slowSteps=0;while(quick.next!=null&&quick.next.next!=null&&slow.next!=null) {if(slow.data==quick.data) {return quickSteps-slowSteps;}quickSteps++;slowSteps++;slow=slow.next;quick=quick.next.next;}return 0;}//5.确定环的入口节点/** 结论:从头结点到环入口的距离=快慢指针相遇处继续走到环入口的距离+环长度的整数倍* 思路:first、second结点,先让second结点走环的长度(整数倍)* 然后first、second同时走,相遇处即为环入口处*/public static Node getLoopNode(Node head) {if(head==null && head.next==null) {return null;}int length=MyLinkedList.getLoopLength(head);Node first=head;Node second=head;while(length-->0&&second.next!=null) {second=second.next;}while(first!=null&&second!=null) {if(first.data==second.data) {return second;}first=first.next;second=second.next;}return null;}public static void printFromLastRec(Node head) {if(head==null) {return;}printFromLastRec(head.next);System.out.println(head.data);}//6.找到两个链的第一个公共节点/** Y型拓扑结构* 思路:计算两个链表的长度;计算长度差;长的链表走长度差步;然后同时走,直到找到公共结点*/public static Node findFirstCommonNode(Node head1,Node head2) {if(head1==null&&head2==null) {return null;}int x=Math.abs(getLength(head1)-getLength(head2));if(getLength(head1)<getLength(head2)) {while(x-->0) {head2=head2.next;}}else {head1=head1.next;}Node temp1=head1;Node temp2=head2;while(head1!=null) {if(temp1==temp2) {return temp2;}temp1=temp1.next;temp2=temp2.next;}return null;}
}

day07 Java链表(环、快慢指针)相关推荐

  1. 【链表】判断链表是否有环-快慢指针

    目录 一.思想 二.代码 三.运行结果 一.思想 什么叫有环? 一个结点有两个指向的时候就会产生环.例如在一个单链表0-9的数据中,3的下个节点为4,让3的下个结点同时指向9,此时就会在3的位置产生两 ...

  2. 试编写一个将双向循环链表逆置的算法_图解:链表的快慢指针,解决 80% 的链表面试题!...

    一.前言 链表是基本的数据结构之一,它与数组不同,数组在内存中存储,需要一块连续的内容空间来存储,对内存的要求比较高.例如我们需要 100MB 大小的数组,内存中就必须有一段连续的 100MB 的内存 ...

  3. 数据结构链表之单链表的快慢指针——3

    单链表之快慢指针 单链表的快慢指针简介 快慢指针指链表中定义两个指针,两个指针的移动速度一快一慢,一般快指针移动步长为慢指针的两倍 快慢指针适合解决的几个典型问题 中间值问题 单向链表是否有环问题 有 ...

  4. 环形链表的快慢指针相遇问题证明

    环形链表的快慢指针相遇问题证明 证明1:慢指针一定在环形链表一圈内遇上 首先假设慢指针的每次只走1步,快指针每次走2步,当慢指针走了k次后,慢指针共走了k步,而快指针走了2k步. 假如说,快指针和慢指 ...

  5. c 链表之 快慢指针 查找循环节点(转)

    上面分析了 根据这张图 推倒出 数学公式. 刚接触 不能一下弄明白.下面结合上面文章的分析.仔细推倒一下 , 一般设置 快指针 速度是 慢指针的2倍.及 快指针每次遍历两个指针, 慢指针每次遍历1个指 ...

  6. 链表中快慢指针的应用

    目录 一.链表的中间结点 二.回文链表 三.链表中倒数第K个结点 四.删除链表的倒数第n个结点 五.环形链表 六.环形链表Ⅱ 一.链表的中间结点 给定一个头结点为 head 的非空单链表,返回链表的中 ...

  7. 环形链表的快慢指针相遇问题以及相遇位置的证明

    假设有这么一个环形链表 第一步 设慢指针走到环的入口处走了K个结点,则快指针走了2K个结点 则有 2 K − K = α + n C 2K-K=α + nC 2K−K=α+nC 其中,α是快指针距离环 ...

  8. reorder-list——链表、快慢指针、逆转链表、链表合并

    Given a singly linked list L: L0→L1→-→Ln-1→Ln, reorder it to: L0→Ln→L1→Ln-1→L2→Ln-2→- You must do th ...

  9. leetcode 141. 环形链表(快慢指针解法)

    题目 思路 绝对的经典题目,快慢指针,慢指针一次走两步,快指针一次走一步,直到两指针相遇,则说明有环. 关于评论区看到的一种思路,本质是做标记.这个办法不是很好,一方面,如果测试用例足够全的话,标记内 ...

最新文章

  1. matlab中,怎样把矩阵中所有的0改为2
  2. 主流WAF架构分析与探索
  3. Storm的StreamID使用样例(版本1.0.2)
  4. 数据挖掘应用现状与产品分析
  5. C# 选中 DataGridView 控件中的行时显示不同的颜色
  6. Decompose Conditional(分解条件表达式)
  7. Java 字符串性能对比
  8. 怎样才能恢复误删的数据-免费版本
  9. PCL visualizer
  10. 面向对象6:构造器、JavaBean、UML图、this的使用
  11. 谈一谈 IPA 上传到 App Store Connect 的几种方法
  12. Android之应用市场排行榜、上架、首发(非原创)
  13. ftp服务器上传文件太慢,ftp服务器上传文件速度多少
  14. 三维图像专业处理软件Dragonfly的中文语言包
  15. Html5之canvas重叠矩形、getContext、fillStyle、fillRect
  16. 在格式化的场景下,React input 的光标的处理办法
  17. 【全开源+免费更新】doodoo.js快速入门教程 1
  18. Fiat-Shamir heuristic(含实现)和Random oracle
  19. Flask_从入门到放弃?不!!!从入门到入土!!
  20. vue对比两段json文本修改,修改的项添加红色高亮显示

热门文章

  1. Python爬虫之Spider类用法简单介绍
  2. 小车PWM调速-串口控制
  3. QCC512x QCC302x earbud工程 LED 配置
  4. 【CIPS 2016】(1-3章)词法、句法、语义、语篇分析(研究进展、现状趋势)
  5. 记一次oracle通过dblink连接mysql实施
  6. 《2022年Java开发者生产力报告》出炉啦
  7. python需要学哪些基础知识_零基础学Python应该学习哪些入门知识
  8. git从远程仓库拉取指定日期版本的代码到本地
  9. 计算机械产值,装配式建筑的蓬勃发展中起重机械设备租赁行业的发展空间有多大??有没有每年的产值增速测算呢??...
  10. 便签纸文字提示ui布局css3