zoukankan      html  css  js  c++  java
  • 剑指offer系列29-----链表中环的入口节点-

    【题目】一个链表中包含环,请找出该链表的环的入口结点。

    【思路】方法一:使用双指针

       方法二:利用set集合的特性,不能添加重复数字,否则返回false
     1 package com.exe7.offer;
     2 
     3 /**
     4  * 【题目】一个链表中包含环,请找出该链表的环的入口结点。
     5  * @author WGS
     6  *
     7  */
     8 public class EntryNodeOfLoop {
     9 
    10     
    11     class LinkNode{
    12         int val;
    13         LinkNode next=null;
    14         public LinkNode(int val){
    15             this.val=val;
    16         }
    17     }
    18     //得到闭环中任一相遇结点
    19     public LinkNode getMeetingNode(LinkNode headNode){
    20         if(headNode==null) return null;
    21         LinkNode slowNode=headNode;
    22         LinkNode fastNode=slowNode.next;
    23         
    24         while(slowNode!=null && fastNode!=null){
    25             if(slowNode==fastNode)
    26                 return fastNode;
    27             slowNode=slowNode.next;
    28             fastNode=fastNode.next;
    29             if(fastNode!=null)
    30                 fastNode=fastNode.next;
    31         }    
    32         return null;
    33         
    34     }
    35     public LinkNode getNodeOfLoop(LinkNode headNode){
    36         if(headNode==null) return null;
    37         
    38         LinkNode meetingNode=getMeetingNode(headNode);
    39         if(meetingNode==null)
    40             return null;
    41         //1 首先根据得到的闭环中得到的结点确定闭环中结点的总共数目
    42         int numOfLoop=1;
    43         LinkNode pNode1=meetingNode.next;
    44         while(pNode1!=meetingNode){
    45             pNode1=pNode1.next;
    46             numOfLoop++;//得到闭环节点数目
    47         }
    48         
    49         //2 根据双指针确定入环结点
    50         pNode1=headNode;
    51         for(int i=0;i<numOfLoop;i++){
    52             pNode1=pNode1.next;
    53         }
    54         LinkNode pNode2=headNode;
    55         while(pNode1!=pNode2){
    56             pNode1=pNode1.next;
    57             pNode2=pNode2.next;
    58         }
    59         return pNode1;
    60         
    61     } 
    62     public static void main(String[] args) {
    63         // TODO Auto-generated method stub
    64 
    65     }
    66 
    67 }
     1 /**
     2      * 方法二:利用set集合的特性,不能添加重复数字,否则返回false
     3      * @param args
     4      */
     5     public LinkNode EntryNodeOfLoop(LinkNode headNode){
     6         Set<LinkNode>  set=new HashSet<>();
     7         while(headNode!=null && set.add(headNode)){
     8             headNode=headNode.next;
     9         }
    10         
    11         return headNode;
    12         
    13     }
  • 相关阅读:
    pandas基础
    博客迁移公告!
    JavaScript: 认识 Object、原型、原型链与继承。
    微信小程序学习
    WEB安全
    webpack
    《JavaScript 高级程序设计》第四章:变量、作用域和内存问题
    NodeJS学习:搭建私有NPM
    《JavaScript 高级程序设计》第三章:基本概念
    Promise 基础学习
  • 原文地址:https://www.cnblogs.com/noaman/p/5566705.html
Copyright © 2011-2022 走看看