免責事項:この記事はブロガーオリジナル記事です、続くBY-SAのCC 4.0を著作権契約、複製、元のソースのリンクと、この文を添付してください。
タイトル説明
リストを指定すると、リストがリングかどうかが決定されます。
リングを与えられたリストを表示するために、我々はリストの位置を表すリストの最後(インデックスは0から始まる)に接続されたPOS整数。posが-1の場合、リングがこのリストに含まれていません。
トピックの例
例1:
入力:ヘッド= [3,2,0、-4] = POS 1つの。 出力: trueに 説明:リストは、第2のノードに接続されたリングテール部分を有しています。
例2:
入力:ヘッド= [1,2]、POS = 0 出力: trueに 説明:リストの最初のノードの尾部に接続されたリングを有しています。
例3:
入力: [1]頭=、POS = -1 出力: falseに 解釈:リストは鳴りません。
問題解決のためのアイデア
1>反復解法
従来の考え方は、そこに次のポインタリング、または他の非環式があった場合は、リストループは、に横断されたかどうかを判断するために、コードを達成することは困難です
2>ハッシュテーブルソリューション
その大きさは要素、環式、または非環式繰り返される場合、リストを横断する、要素は依然として、最初の(即ち、前に置かれている場合)、ハッシュテーブルを横断する前にそこにいるか否かを決定し、ハッシュテーブルに遭遇します。
O(N)の時間計算量はOの空間的複雑度(N)
3>スピードポインター
リングがある場合、問題を解決するための従来の考え方のリストは、各ポインタが速く、さらに一歩進ん遅いポインタの2つのステップを取る、二つのポインタの速度を設定し、ノーリング場合は、その後すぐに終わりにポインタの終わりに行って、より高速なポインタがリングで入力する必要があります遅いポインタで発生しました。
O(LOGN)の時間計算量は、空間的複雑度はO(1)であります
コードの実装
ポインタの速度
public class HasCycle {
public class ListNode {
int val;
ListNode next;
ListNode(int x) {
val = x;
}
}
public boolean hasCycle(ListNode head) {
//非空检验
if(head == null || head.next == null){
return false;
}
//快慢指针
ListNode fast = head.next;
ListNode slow = head;
boolean flag = false;
while(fast != null){
if(fast == slow){
flag = true;
break;
}
//防止空指针
if(fast.next == null){
break;
}
fast = fast.next.next;
slow = slow.next;
}
return flag;
}
}