ポインタの速度:デュアルポインタ。リストに設けられた2つのポインタは、リストには同期を横断していません。我々は2つのポインタ間に必要な距離を製造することができます。
サンプルの変化によって純粋に試験表面タイトルに限り、リストは、ライン上に作られたループが存在するか否かによって決定されます。
Aは考えた:ハッシュ
ほとんどの場合、わずかに繰り返し訪問のリングリスト内のノード、コードがあるだろう時にアイデアは、リストが訪問されるたび、ハッシュこと、およびハッシュテーブルに記録されてそれを置くべきだと思います。
思考2:ポインタの速度
それぞれ二つのポインタ、高速と低速、ステップ2を、提供します。リストには、高速倍の速度が遅いなどの意味滑走路、と比較した場合。リングが速いようではないNULLに迅速高速アクセスが、速いスピード、その後、リストに存在する場合には、遅い遅かれ早かれ一周より、すなわち、いくつかの時間後に2つのポインタが再び(速い==遅い)を満たしています。
1 クラスソリューション{ 2 公共: 3 ブール hasCycle(ListNode * ヘッド){ 4 であれば(NULL ==ヘッド|| NULL ==頭部> 次) 5 リターン 偽。 6 7 ListNode *遅い= ヘッド。 8 ListNode *速い= ヘッド。 9 10 ながら(NULL =高速&& NULL =急速>!次) 11 { 12 速い=急速>ネクスト> 次。 13 遅い=遅い> 次。 14 もし速い(==スロー) 15 リターン 真。 16 } 17 リターン 偽。 18 } 19 }。
ポインタが速い、遅いポインタが正確に中間ノードリストの最後に到達したときに、ポインタの速い速度は、二倍遅くポインタです。
1 クラスソリューション{ 2 公共: 3 ListNode * middleNode(ListNode * ヘッド){ 4 ListNode *遅い= ヘッド。 5 ListNode *速い= ヘッド。 6 場合(NULL ==ヘッド|| NULL ==頭部> 次) 7 戻りヘッド。 8 一方、(1 ) 9 { 10 速い=急速> 次。 11 であれば(NULL ==急速> 次) 12 リターン遅い> 次。 13 遅い=遅いです>次; 14 高速=急速> 次。 15 であれば(急速>次== NULL) 16 リターン遅いです。 17 } 18 } 19 }。
Nノードのリストを削除するには相互リンクLeetCode 19 培地
Nは、ポインタが速いポインタ前にN番目の要素への高速、低速の右ポインタポイントの端に到達したときに迅速ポインタが最初に、その後、同じ速度でリストを横断するようにステップ。
1 クラスソリューション{ 2 公共: 3 ListNode * removeNthFromEnd(ListNode *ヘッド、INT N){ 4 ListNode *遅い= ヘッド。 5 ListNode *速い= ヘッド。 6 のための(int型私は= 0を!;; I = N ++ i)は 7 速い=急速> 次。 8 もし(NULL == 速い) 9 リターン頭部> 次。 10 一方(NULL!=急速> 次) 11 { 12 速い=急速> 次。 13 遅い=遅い> 次。 14 } 15 遅い>次=遅い>ネクスト> 次。 16 リターンヘッド; 17 } 18 }。