国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

鏈表中環的入口結點

2019-11-08 03:25:47
字體:
來源:轉載
供稿:網友
題目描述

一個鏈表中包含環,請找出該鏈表的環的入口結點。

IDEA

1.首先判斷鏈表是否帶環。

采用在頭結點設兩個指針,一個叫fast,一個叫slow,fast一下走兩步,而slow一下走一步。如果鏈表中存在環的話,那么fast和slow必定會在環中相遇。若鏈表中沒有環的話,那么fast必定現于slow指針先到達鏈表的尾節點(->next = Null)。

2.找出環的入口點。

相遇的時候,slow共移動了s步,fast共移動了2s步。定義a:鏈表頭移動a步到達入口點。定義x:入口點移動x步到達相遇點。定義c:環長度。有2s=s+nc=>s=ncs=a+x=>a+x=nc=>a=nc-x=>a=nc-c+c-x=(n-1)c+(c-x)即c-x為相遇點到環入口點的距離,由此可知,從鏈表頭到環入口點等于(n-1)循環內環+相遇點到環入口點,于是我們從鏈表頭、與相遇點分別設一個指針,每次各走一步,兩個指針必定相遇,且相遇第一點為環入口點。

2.可以計算環的長度。

再環的入口點設一指針和一計數器,讓這一指針在環里面跑,計數器不斷自增。當這一指針回到環的入口點的時候,環長就出來啦。

CODE

/* public class ListNode {    int val;    ListNode next = null;    ListNode(int val) {        this.val = val;    }}*/public class Solution {    public ListNode EntryNodeOfLoop(ListNode pHead)    {        if(pHead==null||pHead.next==null)            return null;        ListNode slow=pHead,fast=pHead;        while(fast!=null&&fast.next!=null){            slow=slow.next;            fast=fast.next.next;            if(slow==fast)                break;        }        if(fast==null||fast.next==null)            return null;        slow=pHead;        while(slow!=fast){            slow=slow.next;            fast=fast.next;        }        return slow;    }}


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 文山县| 东阳市| 湖北省| 镇坪县| 正镶白旗| 衡水市| 万宁市| 兴化市| 瑞金市| 顺昌县| 民县| 土默特左旗| 南康市| 晋城| 柳河县| 华亭县| 黑河市| 长葛市| 西华县| 曲阜市| 云霄县| 阿克苏市| 浑源县| 平潭县| 苍溪县| 唐海县| 中超| 普定县| 普兰店市| 如皋市| 勐海县| 沙洋县| 陵水| 克什克腾旗| 阜南县| 徐水县| 嵩明县| 兴化市| 玉山县| 屏山县| 社旗县|