• 剑指offer-面试题23-链表中环的入口节点-双指针


    /*
    题目:
    	如果链表中包含环,如何找出环的入口?
    */
    /*
    思路:
    	双指针:
    		1、判断是否有环。
    			fast指针一次2步,slow指针一次1步,当fast与slow相遇时,说明有环。
    		2、判断环路中节点的个数。
    			当fast和slow相遇的节点在环上,一个指针固定,
    			另一个指针循环一周再次遇到该固定指针,遍历的个数即为节点个数。
    		3、找到入口节点。
    			fast指针先走k步,
    			接着,fast和slow指针同时遍历,
    			相遇节点即为入口节点。
    */
    #include<iostream>
    #include<string.h>
    #include<algorithm>
    #include<cmath>
    #include<stdio.h>
    using namespace std;
    
    struct ListNode {
    	int val;
    	struct ListNode *next;
    	ListNode(int x) :
    			val(x), next(NULL) {
    	}
    };
    
    int LoopNodeLength(ListNode* pHead){
        int length = 0;
        ListNode* slow = pHead;
        ListNode* fast = pHead->next;
        if(fast == nullptr) return length;
    
        while(fast->next != nullptr && fast != slow){
            fast = fast->next->next;
            slow = slow->next;
        }
        if(fast->next != nullptr){
            fast = slow->next;
            length = 1;
            while(fast != slow){
                length++;
                fast = fast->next;
            }
        }
        return length;
    
    }
     ListNode* EntryNodeOfLoop(ListNode* pHead)
    {
        if(pHead == nullptr) return nullptr;
        int length = LoopNodeLength(pHead);
        if(length == 0) return nullptr;
    
        ListNode* fast = pHead;
        ListNode* slow = pHead;
        for(int i = 0; i < length; i++){
            fast = fast->next;
        }
        while(fast != slow){
            fast = fast->next;
            slow = slow->next;
        }
        return slow;
    }
    
    
    
    int main(){
       ListNode* node1 = new ListNode(1);
       ListNode* node2 = new ListNode(2);
       ListNode* node3 = new ListNode(3);
       node1->next = node2;
       node2->next = node3;
       node3->next = node1;
       cout<<EntryNodeOfLoop(node1)->val<<endl;
    }
    

       

  • 相关阅读:
    修改Nginx的header伪装服务器
    解除与设置计算机锁定
    Adobe flash cs5 的Java运行时环境初始化错误 完美解决方法
    js正则表达式教程
    Eclipse窗口显示:独立、嵌入式
    [置顶] wzplayer for android NEON版本(添加插图)
    买了一块s5pv210 的开发板
    [置顶] android player ,wzplayer for android NEON版本(添加插图)
    make 输出 log 文件
    android player ,wzplayer for android NEON版本(添加插图)
  • 原文地址:https://www.cnblogs.com/buaaZhhx/p/11901555.html
Copyright © 2020-2023  润新知