| 1 | Initialize slow and fast at head | Node 10 | Node 10 | slow=head, fast=head | āāāāāāāāāā āāāāāāāāāā āāāāāāāāāā āāāāāāāāāā
ā data:10āāāā ā data:20āāāā ā data:30āāāā ā data:40ā
ā next:āāā¼āāā ā next:āāā¼āāā ā next:āāā¼āāā ā next:āāā¼āā
āāāāāāāāāā āāāāāāāāāā āāāāāāāāāā āāāāāāāāāā
head |
| 2 | Move slow by 1 step | Node 20 | Node 10 | slow = slow.next | āāāāāāāāāā āāāāāāāāāā āāāāāāāāāā āāāāāāāāāā
ā data:10ā ā data:20āāāā ā data:30āāāā ā data:40ā
ā next:āāā¼āāā ā next:āāā¼āāā ā next:āāā¼āāā ā next:āāā¼āā
āāāāāāāāāā āāāāāāāāāā āāāāāāāāāā āāāāāāāāāā
head slow |
| 3 | Move fast by 2 steps | Node 20 | Node 30 | fast = fast.next.next | āāāāāāāāāā āāāāāāāāāā āāāāāāāāāā āāāāāāāāāā
ā data:10ā ā data:20āāāā ā data:30āāāā ā data:40ā
ā next:āāā¼āāā ā next:āāā¼āāā ā next:āāā¼āāā ā next:āāā¼āā
āāāāāāāāāā āāāāāāāāāā āāāāāāāāāā āāāāāāāāāā
head fast |
| 4 | Check slow == fast? | Node 20 | Node 30 | No match, continue loop | Pointers at different nodes, no cycle detected yet |
| 5 | Move slow by 1 step | Node 30 | Node 30 | slow = slow.next | āāāāāāāāāā āāāāāāāāāā āāāāāāāāāā āāāāāāāāāā
ā data:10ā ā data:20ā ā data:30āāāā ā data:40ā
ā next:āāā¼āāā ā next:āāā¼āāā ā next:āāā¼āāā ā next:āāā¼āā
āāāāāāāāāā āāāāāāāāāā āāāāāāāāāā āāāāāāāāāā
head slow |
| 6 | Move fast by 2 steps | Node 30 | Node 40 | fast = fast.next.next | āāāāāāāāāā āāāāāāāāāā āāāāāāāāāā āāāāāāāāāā
ā data:10ā ā data:20ā ā data:30ā ā data:40ā
ā next:āāā¼āāā ā next:āāā¼āāā ā next:āāā¼āāā ā next:āāā¼āā
āāāāāāāāāā āāāāāāāāāā āāāāāāāāāā āāāāāāāāāā
head fast |
| 7 | Check slow == fast? | Node 30 | Node 40 | No match, continue loop | Pointers at different nodes, no cycle detected yet |
| 8 | Move slow by 1 step | Node 40 | Node 40 | slow = slow.next | āāāāāāāāāā āāāāāāāāāā āāāāāāāāāā āāāāāāāāāā
ā data:10ā ā data:20ā ā data:30ā ā data:40ā
ā next:āāā¼āāā ā next:āāā¼āāā ā next:āāā¼āāā ā next:āāā¼āā
āāāāāāāāāā āāāāāāāāāā āāāāāāāāāā āāāāāāāāāā
head slow |
| 9 | Move fast by 2 steps | Node 40 | Node 30 | fast = fast.next.next (cycle back to Node 30) | Cycle created: Node 40 points back to Node 30
Pointers:
slow ā Node 40
fast ā Node 30 |
| 10 | Check slow == fast? | Node 40 | Node 30 | No match, continue loop | Pointers at different nodes, cycle detected but pointers not met yet |
| 11 | Move slow by 1 step | Node 30 | Node 30 | slow = slow.next (cycle back to Node 30) | Cycle continues:
slow ā Node 30
fast ā Node 30 |
| 12 | Move fast by 2 steps | Node 30 | Node 40 | fast = fast.next.next (cycle back to Node 40) | Cycle continues:
slow ā Node 30
fast ā Node 40 |
| 13 | Check slow == fast? | Node 30 | Node 40 | No match, continue loop | Pointers at different nodes, cycle detected but pointers not met yet |
| 14 | Move slow by 1 step | Node 40 | Node 40 | slow = slow.next | Cycle continues:
slow ā Node 40
fast ā Node 40 |
| 15 | Move fast by 2 steps | Node 40 | Node 30 | fast = fast.next.next | Cycle continues:
slow ā Node 40
fast ā Node 30 |
| 16 | Check slow == fast? | Node 40 | Node 30 | No match, continue loop | Pointers at different nodes, cycle detected but pointers not met yet |
| 17 | Move slow by 1 step | Node 30 | Node 30 | slow = slow.next | Cycle continues:
slow ā Node 30
fast ā Node 30 |
| 18 | Move fast by 2 steps | Node 30 | Node 40 | fast = fast.next.next | Cycle continues:
slow ā Node 30
fast ā Node 40 |
| 19 | Check slow == fast? | Node 30 | Node 40 | No match, continue loop | Pointers at different nodes, cycle detected but pointers not met yet |
| 20 | Move slow by 1 step | Node 40 | Node 40 | slow = slow.next | Cycle continues:
slow ā Node 40
fast ā Node 40 |
| 21 | Move fast by 2 steps | Node 40 | Node 30 | fast = fast.next.next | Cycle continues:
slow ā Node 40
fast ā Node 30 |
| 22 | Check slow == fast? | Node 40 | Node 30 | No match, continue loop | Pointers at different nodes, cycle detected but pointers not met yet |
| 23 | Move slow by 1 step | Node 30 | Node 30 | slow = slow.next | Cycle continues:
slow ā Node 30
fast ā Node 30 |
| 24 | Move fast by 2 steps | Node 30 | Node 40 | fast = fast.next.next | Cycle continues:
slow ā Node 30
fast ā Node 40 |
| 25 | Check slow == fast? | Node 30 | Node 40 | No match, continue loop | Pointers at different nodes, cycle detected but pointers not met yet |
| 26 | Move slow by 1 step | Node 40 | Node 40 | slow = slow.next | Cycle continues:
slow ā Node 40
fast ā Node 40 |
| 27 | Move fast by 2 steps | Node 40 | Node 30 | fast = fast.next.next | Cycle continues:
slow ā Node 40
fast ā Node 30 |
| 28 | Check slow == fast? | Node 40 | Node 30 | No match, continue loop | Pointers at different nodes, cycle detected but pointers not met yet |
| 29 | Move slow by 1 step | Node 30 | Node 30 | slow = slow.next | Cycle continues:
slow ā Node 30
fast ā Node 30 |
| 30 | Move fast by 2 steps | Node 30 | Node 40 | fast = fast.next.next | Cycle continues:
slow ā Node 30
fast ā Node 40 |
| 31 | Check slow == fast? | Node 30 | Node 40 | No match, continue loop | Pointers at different nodes, cycle detected but pointers not met yet |
| 32 | Move slow by 1 step | Node 40 | Node 40 | slow = slow.next | Cycle continues:
slow ā Node 40
fast ā Node 40 |
| 33 | Move fast by 2 steps | Node 40 | Node 30 | fast = fast.next.next | Cycle continues:
slow ā Node 40
fast ā Node 30 |
| 34 | Check slow == fast? | Node 40 | Node 30 | No match, continue loop | Pointers at different nodes, cycle detected but pointers not met yet |
| 35 | Move slow by 1 step | Node 30 | Node 30 | slow = slow.next | Cycle continues:
slow ā Node 30
fast ā Node 30 |
| 36 | Move fast by 2 steps | Node 30 | Node 40 | fast = fast.next.next | Cycle continues:
slow ā Node 30
fast ā Node 40 |
| 37 | Check slow == fast? | Node 30 | Node 40 | No match, continue loop | Pointers at different nodes, cycle detected but pointers not met yet |
| 38 | Move slow by 1 step | Node 40 | Node 40 | slow = slow.next | Cycle continues:
slow ā Node 40
fast ā Node 40 |
| 39 | Move fast by 2 steps | Node 40 | Node 30 | fast = fast.next.next | Cycle continues:
slow ā Node 40
fast ā Node 30 |
| 40 | Check slow == fast? | Node 40 | Node 30 | No match, continue loop | Pointers at different nodes, cycle detected but pointers not met yet |
| 41 | Move slow by 1 step | Node 30 | Node 30 | slow = slow.next | Cycle continues:
slow ā Node 30
fast ā Node 30 |
| 42 | Move fast by 2 steps | Node 30 | Node 40 | fast = fast.next.next | Cycle continues:
slow ā Node 30
fast ā Node 40 |
| 43 | Check slow == fast? | Node 30 | Node 40 | No match, continue loop | Pointers at different nodes, cycle detected but pointers not met yet |
| 44 | Move slow by 1 step | Node 40 | Node 40 | slow = slow.next | Cycle continues:
slow ā Node 40
fast ā Node 40 |
| 45 | Move fast by 2 steps | Node 40 | Node 30 | fast = fast.next.next | Cycle continues:
slow ā Node 40
fast ā Node 30 |
| 46 | Check slow == fast? | Node 40 | Node 30 | No match, continue loop | Pointers at different nodes, cycle detected but pointers not met yet |
| 47 | Move slow by 1 step | Node 30 | Node 30 | slow = slow.next | Cycle continues:
slow ā Node 30
fast ā Node 30 |
| 48 | Move fast by 2 steps | Node 30 | Node 40 | fast = fast.next.next | Cycle continues:
slow ā Node 30
fast ā Node 40 |
| 49 | Check slow == fast? | Node 30 | Node 40 | No match, continue loop | Pointers at different nodes, cycle detected but pointers not met yet |
| 50 | Move slow by 1 step | Node 40 | Node 40 | slow = slow.next | Cycle continues:
slow ā Node 40
fast ā Node 40 |
| 51 | Move fast by 2 steps | Node 40 | Node 30 | fast = fast.next.next | Cycle continues:
slow ā Node 40
fast ā Node 30 |
| 52 | Check slow == fast? | Node 40 | Node 30 | No match, continue loop | Pointers at different nodes, cycle detected but pointers not met yet |
| 53 | Move slow by 1 step | Node 30 | Node 30 | slow = slow.next | Cycle continues:
slow ā Node 30
fast ā Node 30 |
| 54 | Move fast by 2 steps | Node 30 | Node 40 | fast = fast.next.next | Cycle continues:
slow ā Node 30
fast ā Node 40 |
| 55 | Check slow == fast? | Node 30 | Node 40 | No match, continue loop | Pointers at different nodes, cycle detected but pointers not met yet |
| 56 | Move slow by 1 step | Node 40 | Node 40 | slow = slow.next | Cycle continues:
slow ā Node 40
fast ā Node 40 |
| 57 | Move fast by 2 steps | Node 40 | Node 30 | fast = fast.next.next | Cycle continues:
slow ā Node 40
fast ā Node 30 |
| 58 | Check slow == fast? | Node 40 | Node 30 | No match, continue loop | Pointers at different nodes, cycle detected but pointers not met yet |
| 59 | Move slow by 1 step | Node 30 | Node 30 | slow = slow.next | Cycle continues:
slow ā Node 30
fast ā Node 30 |
| 60 | Move fast by 2 steps | Node 30 | Node 40 | fast = fast.next.next | Cycle continues:
slow ā Node 30
fast ā Node 40 |
| 61 | Check slow == fast? | Node 30 | Node 40 | No match, continue loop | Pointers at different nodes, cycle detected but pointers not met yet |
| 62 | Move slow by 1 step | Node 40 | Node 40 | slow = slow.next | Cycle continues:
slow ā Node 40
fast ā Node 40 |
| 63 | Move fast by 2 steps | Node 40 | Node 30 | fast = fast.next.next | Cycle continues:
slow ā Node 40
fast ā Node 30 |
| 64 | Check slow == fast? | Node 40 | Node 30 | No match, continue loop | Pointers at different nodes, cycle detected but pointers not met yet |
| 65 | Move slow by 1 step | Node 30 | Node 30 | slow = slow.next | Cycle continues:
slow ā Node 30
fast ā Node 30 |
| 66 | Move fast by 2 steps | Node 30 | Node 40 | fast = fast.next.next | Cycle continues:
slow ā Node 30
fast ā Node 40 |
| 67 | Check slow == fast? | Node 30 | Node 40 | No match, continue loop | Pointers at different nodes, cycle detected but pointers not met yet |
| 68 | Move slow by 1 step | Node 40 | Node 40 | slow = slow.next | Cycle continues:
slow ā Node 40
fast ā Node 40 |
| 69 | Move fast by 2 steps | Node 40 | Node 30 | fast = fast.next.next | Cycle continues:
slow ā Node 40
fast ā Node 30 |
| 70 | Check slow == fast? | Node 40 | Node 30 | No match, continue loop | Pointers at different nodes, cycle detected but pointers not met yet |
| 71 | Move slow by 1 step | Node 30 | Node 30 | slow = slow.next | Cycle continues:
slow ā Node 30
fast ā Node 30 |
| 72 | Move fast by 2 steps | Node 30 | Node 40 | fast = fast.next.next | Cycle continues:
slow ā Node 30
fast ā Node 40 |
| 73 | Check slow == fast? | Node 30 | Node 40 | No match, continue loop | Pointers at different nodes, cycle detected but pointers not met yet |
| 74 | Move slow by 1 step | Node 40 | Node 40 | slow = slow.next | Cycle continues:
slow ā Node 40
fast ā Node 40 |
| 75 | Move fast by 2 steps | Node 40 | Node 30 | fast = fast.next.next | Cycle continues:
slow ā Node 40
fast ā Node 30 |
| 76 | Check slow == fast? | Node 40 | Node 30 | No match, continue loop | Pointers at different nodes, cycle detected but pointers not met yet |
| 77 | Move slow by 1 step | Node 30 | Node 30 | slow = slow.next | Cycle continues:
slow ā Node 30
fast ā Node 30 |
| 78 | Move fast by 2 steps | Node 30 | Node 40 | fast = fast.next.next | Cycle continues:
slow ā Node 30
fast ā Node 40 |
| 79 | Check slow == fast? | Node 30 | Node 40 | No match, continue loop | Pointers at different nodes, cycle detected but pointers not met yet |
| 80 | Move slow by 1 step | Node 40 | Node 40 | slow = slow.next | Cycle continues:
slow ā Node 40
fast ā Node 40 |
| 81 | Move fast by 2 steps | Node 40 | Node 30 | fast = fast.next.next | Cycle continues:
slow ā Node 40
fast ā Node 30 |
| 82 | Check slow == fast? | Node 40 | Node 30 | No match, continue loop | Pointers at different nodes, cycle detected but pointers not met yet |
| 83 | Move slow by 1 step | Node 30 | Node 30 | slow = slow.next | Cycle continues:
slow ā Node 30
fast ā Node 30 |
| 84 | Move fast by 2 steps | Node 30 | Node 40 | fast = fast.next.next | Cycle continues:
slow ā Node 30
fast ā Node 40 |
| 85 | Check slow == fast? | Node 30 | Node 40 | No match, continue loop | Pointers at different nodes, cycle detected but pointers not met yet |
| 86 | Move slow by 1 step | Node 40 | Node 40 | slow = slow.next | Cycle continues:
slow ā Node 40
fast ā Node 40 |
| 87 | Move fast by 2 steps | Node 40 | Node 30 | fast = fast.next.next | Cycle continues:
slow ā Node 40
fast ā Node 30 |
| 88 | Check slow == fast? | Node 40 | Node 30 | No match, continue loop | Pointers at different nodes, cycle detected but pointers not met yet |
| 89 | Move slow by 1 step | Node 30 | Node 30 | slow = slow.next | Cycle continues:
slow ā Node 30
fast ā Node 30 |
| 90 | Move fast by 2 steps | Node 30 | Node 40 | fast = fast.next.next | Cycle continues:
slow ā Node 30
fast ā Node 40 |
| 91 | Check slow == fast? | Node 30 | Node 40 | No match, continue loop | Pointers at different nodes, cycle detected but pointers not met yet |
| 92 | Move slow by 1 step | Node 40 | Node 40 | slow = slow.next | Cycle continues:
slow ā Node 40
fast ā Node 40 |
| 93 | Move fast by 2 steps | Node 40 | Node 30 | fast = fast.next.next | Cycle continues:
slow ā Node 40
fast ā Node 30 |
| 94 | Check slow == fast? | Node 40 | Node 30 | No match, continue loop | Pointers at different nodes, cycle detected but pointers not met yet |
| 95 | Move slow by 1 step | Node 30 | Node 30 | slow = slow.next | Cycle continues:
slow ā Node 30
fast ā Node 30 |
| 96 | Move fast by 2 steps | Node 30 | Node 40 | fast = fast.next.next | Cycle continues:
slow ā Node 30
fast ā Node 40 |
| 97 | Check slow == fast? | Node 30 | Node 40 | No match, continue loop | Pointers at different nodes, cycle detected but pointers not met yet |
| 98 | Move slow by 1 step | Node 40 | Node 40 | slow = slow.next | Cycle continues:
slow ā Node 40
fast ā Node 40 |
| 99 | Move fast by 2 steps | Node 40 | Node 30 | fast = fast.next.next | Cycle continues:
slow ā Node 40
fast ā Node 30 |
| 100 | Check slow == fast? | Node 40 | Node 30 | No match, continue loop | Pointers at different nodes, cycle detected but pointers not met yet |