剑指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     }
时间: 2024-08-03 08:49:40

剑指offer系列29-----链表中环的入口节点-的相关文章

【剑指Offer】删除链表中重复的节点

题目:在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5 A:当遍历到第一个值为重复的节点时,要有一个指针指向它的前一个节点    因为函数原型没有传二级指针进来,且头结点也有可能被删除,所以要构建一个新结点Head 用布尔型的flag_repeat判断是否有重复节点,若有重复节点则删除,若没有重复节点则移动指针 /* struct Li

剑指offer系列31-----二叉树的下一个节点

[题目]给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回. 注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针. 1 package com.exe7.offer; 2 3 /** 4 * [题目]给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回. 5 * 注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针. 6 * @author WGS 7 * 8 */ 9 public class GetNextNode { 10 11 pu

剑指Offer - 两个链表第一个公共节点

https://www.nowcoder.com/practice/6ab1d9a29e88450685099d45c9e31e46?tpId=13&tqId=11189&tPage=2&rp=2&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking 题目描述 输入两个链表,找出它们的第一个公共结点. 代码: 注意:没有检测环状链表. /* struct ListNode { int

剑指offer:删除链表中重复的节点

题目描述在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5 # Definition for singly-linked list. class ListNode: def __init__(self, x): self.val = x self.next = None class Solution: def deleteDuplicat

剑指Offer对答如流系列 - 链表中环的入口节点

面试题23:链表中环的入口节点 问题描述 一个链表中包含环,如何找出环的入口结点?例如,在图中的链表中,环的入口结点是结点3. 链表的结构 public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; } } 问题分析 首先不能忽略链表中不包含环的情况,第一件事情必须先确定链表是否有环:我们可以使用两个引用,一个跑的快.一个跑的慢,同时出发,跑的快的追上跑的慢的自然说明有环.(

剑指offer(二十三,二十四,二十五)最小的k个数,连续子数组的最大和,链表中环的入口节点

23:最小的k个数 题目描述 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. 简单题.... function GetLeastNumbers_Solution(input, k) { if(k>input.length) return []; let ans = []; input = input.sort(); //console.log(input.join("").slice(0,4).split

剑指Offer系列之题11~题15

目录 11.矩形覆盖 12.二进制中1的个数 13. 数值的整数次方 14.调整数组顺序使奇数位于偶数前面 15.链表中倒数第k个结点 11.矩形覆盖 我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形.请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? 比如n=3时,2*3的矩形块有3种覆盖方法: 斐波那契数列的应用 第一次竖着放一块类比为走一步,第一次横着放两块类比为走两步 代码与上面的斐波那契数列类题目类似,此处不再赘述:剑指Offer系列之题6~题10. 12.

【剑指offer】复杂链表的复制

转载请注明出处:http://blog.csdn.net/ns_code/article/details/26154691 题目描述: 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点). 输入: 输入可能包含多个测试样例,输入以EOF结束.对于每个测试案例,输入的第一行为一个整数n (1<=n<=1000):n代表将要输入的链表元素的个数.(节点编号从1开始).接下来有n个数,表示链表节点中的值.接下来有n个数Ti,Ti表示第i个节点的另

剑指OFFER之反转链表(九度OJ1518)

题目描述: 输入一个链表,反转链表后,输出链表的所有元素.(hint : 请务必使用链表) 输入: 输入可能包含多个测试样例,输入以EOF结束.对于每个测试案例,输入的第一行为一个整数n(0<=n<=1000):代表将要输入的链表的个数.输入的第二行包含n个整数t(0<=t<=1000000):代表链表元素. 输出: 对应每个测试案例,以此输出链表反转后的元素,如没有元素则输出NULL. 样例输入: 5 1 2 3 4 5 0 样例输出: 5 4 3 2 1 NULL 解题思路: