FasterRunner/SlowerRunnerアルゴリズムlinkedlistのloopを検出


本技術博の第1文は、筆者がdata structure and algorithmを学ぶ過程でのいくつかの心得と総括のために、復習にすぎない.
Ctciのlinkedlistの最後の質問:
Detect the loop of a given linkde list and return to the first node of the list.
Faster/Slowerアルゴリズムの概要:
2つのポインタを作成し、linkedlistの最初のnodeから後ろに移動し、fasterは2つの距離を移動し、slowerは1つの距離を移動します.このように一定回数後、2つのポインタが出会ったり、nullに歩いてリストを飛び出したりします.リストからジャンプすると、リストにloopがないことを示します.
今は出会いを考えています.linkedlistにk個のnodesがloopの外にあると仮定すると、2つのポインタの変化は次のようになります.
1.slowerはk回移動した後、loop起点に到達し、このときfasterはloop中で第起点のk番目のnodeから(fasterは2*kの距離を移動した)
2.このときslowerとfasterの距離はkであり、loopであるためfaster距離slower(loopsize-k)距離と見なすことができ、同時にfasterは1の速度でslowerに近づいている.(faster速度2,slower速度1)が(loopsize-k)回移動した後、2つのポインタが出会った.
3.出会ったときにslowerはloopsize-k距離を移動した(loopに入った後)ので、slowerはこのときloopの始点(loopsoze-loopsize-k)=k、すなわちlinkedlistの最初の要素からloopの始点までの距離である.
4.次にスタート地点に戻るのは簡単です.2つのポインタ、1つは出会い点から、もう1つはlistスタート地点から、彼らが出会った場所はloopスタート地点(距離はすべてk)です.
アルゴリズム解析:
linkedList長k+size,nodeはk+(loopsize-k)にアクセスし,kを返す.複雑度O(n)は,他の空間を用いず(hashmapの方法に比べて)
Javaコード:
public static Node detectLoop(Node first){
                Node slower=first;
                Node faster=first;
                while(slower!=null&&faster!=null){
                        slower=slower.getNext();
                        faster=faster.getNext().getNext();
                        if(slower==faster&&slower!=null&&faster!=null){
                                Node a=first;
                                Node b=slower;
                                while(a!=b){
                                        a=a.getNext();
                                        b=b.getNext();
                                }
                                return a;
                                
                        }
                }
                return null;
        }