【题目】一个链表中包含环,请找出该链表的环的入口结点。
【思路】方法一:使用双指针
方法二:利用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 }
时间: 2024-10-05 13:13:44