I added to the CT package

Hi,

There exists a very elegant algorithm to detect cycles in linked lists.

  https://en.wikipedia.org/wiki/Cycle_detection#Tortoise_and_hare

I know that our LinkedList was written with the assumption that there are no cycles. However, it seems to me that it would be nice to have a test to check for cycles. This could be useful while printing or inspecting a LinkedList (and prevent things from blowing up when there is a cycle).

Here is the implementation:

LinkedList>>#containsCycle
  | slow fast |
  slow := fast := firstLink.
  [ slow notNil and: [ fast notNil and: [ fast nextLink notNil ] ] ]
    whileTrue: [
      slow := slow nextLink.
      fast := fast nextLink nextLink.
      slow == fast
        ifTrue: [ ^ true ] ].
  ^ false

And one of the tests:

LinkedListTests>>#testCycles
  1 to: 42 do: [ :each |
    list := LinkedList withAll: (1 to: each).
    "Warning: the following statement creates a cylce,
     inspecting/viewing list will probably fail"
    list lastLink nextLink: list firstLink.
    self assert: list containsCycle ]

Opinions ?

Sven




--
Using Opera's mail client: http://www.opera.com/mail/

Reply via email to