タイトル説明
リンクされたリストに、前記リングが含む場合、エントリのリングノードリストを見つけるには、そうでない場合は、ヌル出力します。
問題解決のためのアイデア
シンク付きのリングを見つけるための最初のステップ。それぞれP1、リストの先頭、P1各歩行ステップのP2点、P2はそれぞれ、リング内の位相P1 == P2の検索シンクまでの2つのステップを取ります。
第二段階は、入口リングを検索します。N、ステップ、P1 == P2、P2が2Xを介してノードの数である場合、P1は、Xそこを通ってノードの数であるが、環中のNノードが提供される接続、P2はP1複数の2Xで歩くより= N + X = X; P1ケース指向入口リング; p1は工程数が実際にリストの先頭、同じ位置P1、P1、P2、P1 == P2工程まで各パスをできるように、P2点をリングを歩いたことがわかります。
コードは以下の通りです
公共ListNode EntryNodeOfLoop(ListNode PHEAD) { ListNode listNode1 = PHEAD。 ListNode listNode2 = PHEAD。 試す{ int型フラグ= 0 。 一方、(pHead.next!= NULL ){ 場合(listNode1 == PHEAD){ フラグ ++ 。 もし(フラグ> = 2 ){ 戻り ヌル。 } } listNode1 =listNode1.next; listNode2 = listNode2.next.next。 もし(listNode1 == listNode2){ listNode2 = PHEAD。 一方、(!listNode1 = listNode2) { listNode1 = listNode1.next。 listNode2 = listNode2.next。 } 場合(listNode1 == listNode2){ 戻りlistNode1と、 } 戻りlistNode1と、 } } } キャッチ(NullPointerExceptionが電子){ 戻り ヌル。 } 戻り ヌル。 } パブリック クラスListNode { int型のval; ListNode次 = nullを。 ListNode(int型のval){ この .val = ヴァル。 } }