2016-11-19 2 views
-1

Die meisten Lösungen zum Erkennen der Schleife in einer verketteten Liste sagen, dass der schnelle Zeiger zweimal die Schritte des langsamen Zeigers verschieben muss. Warum können wir nicht den schnellen Zeiger nur einen Schritt voraus haben und wenn fast.next == slow wir fertig sind. Der Code würde wie folgtWarum muss der schnelle Zeiger in der Schleifenerkennung der verknüpften Liste zwei Schritte voraus sein?

slow = head; 
fast = head.next; 

while(fast.next != slow) 
{ 
    slow = slow.next; 
    fast = fast.next; 
    if(fast == null) /* No loop to begin with, break */ 
     break; 
} 

return fast; /* The starting loop node*/ 

Edits aussehen: Ich meinte fast.next = langsam

+0

Ihn, wie würde das Zyklus größeren Länge tha erfassen n, wie, 2? –

+0

Was bedeutet das? Dieser Ansatz mag naiv sein, aber es sollte funktionieren. Das Fasten ist immer eins voraus. hier treffen sich schnell und langsam nicht aber langsam.next muss für einen Zyklus gleich schnell sein. – Hooli

+1

Äh, wie es aussieht, ist "langsam.next" immer gleich "schnell", egal ob es einen Zyklus gibt oder nicht. Zu sagen "das schnelle ist immer eins voraus" ist dasselbe wie zu sagen "langsam.next ist gleich schnell". –

Antwort

2

Erstens, weil Ihre Zeiger wird nie erfüllen, schnell, da immer eine vor langsam sein, und das! Pointer Meeting ist, was Sie verwenden, um einen Zyklus zu erkennen.

Auch wenn Sie Schleifen haben, werden Sie in Endlosschleifen gelangen. Angenommen, Sie

1 -> 2 -> 3 -> 4 
    ^_________| 
  1. haben, wenn langsam 1 ist, schnell 2
  2. wenn langsam 2 ist, schnell 3
  3. wenn langsam 3 ist, schnell 4
  4. wenn langsam 4 , schnell 2
  5. langsam, wenn 2 ist, schnell 3 (wir haben hier gewesen, Endlosschleife)
+0

Vielen Dank! Ich weiß nicht, was ich dachte, als ich diese Frage hier gepostet habe. – Hooli

Verwandte Themen