forked from wangzheng0822/algo
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
ivan
committed
Dec 15, 2018
1 parent
c10dc78
commit 4eca539
Showing
2 changed files
with
134 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,58 @@ | ||
package ch07_linkedlist | ||
|
||
import ch06_linkedlist.Node | ||
|
||
object LinkedListAlgo { | ||
|
||
//reverse a linked list | ||
def reverse(head: Node): Node = { | ||
if (head.next.isEmpty) { | ||
//single node of linked list | ||
return head | ||
} | ||
var prev: Option[Node] = None | ||
var current: Option[Node] = Some(head) | ||
var next: Option[Node] = None | ||
|
||
while (current.get.next.isDefined) { | ||
next = current.get.next | ||
current.get.next = prev | ||
|
||
prev = current | ||
current = next | ||
} | ||
//for the tail of the node, make it point to previous node to complete the reverse | ||
current.get.next = prev | ||
|
||
current.get | ||
} | ||
|
||
def checkCircle(head: Node): Boolean = { | ||
var fast = head | ||
var slow = head | ||
|
||
while (fast.next.isDefined && fast.next.get.next.isDefined) { | ||
fast = fast.next.get.next.get | ||
slow = slow.next.get | ||
|
||
if (fast.equals(slow)) { | ||
return true | ||
} | ||
} | ||
false | ||
} | ||
|
||
//form all the chain value as string | ||
def mkStringForChain(node: Node): String = { | ||
val result = new StringBuilder | ||
|
||
var p = node | ||
|
||
while (p.next.isDefined) { | ||
result.append(p.data) | ||
p = p.next.get | ||
} | ||
result.append(p.data) | ||
result.mkString | ||
} | ||
} |
76 changes: 76 additions & 0 deletions
76
scala/src/test/scala/ch07_linkedlist/LinkedListAlgoTest.scala
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,76 @@ | ||
package ch07_linkedlist | ||
|
||
import ch06_linkedlist.{Node, SinglyLinkedList} | ||
import org.scalatest.{FlatSpec, Matchers} | ||
|
||
class LinkedListAlgoTest extends FlatSpec with Matchers { | ||
|
||
behavior of "LinkedListAlgoTest" | ||
|
||
it should "reverse a node for long linked list" in { | ||
val list = new SinglyLinkedList() | ||
|
||
for (i <- 0 to 9) { | ||
list.insertTail(i) | ||
} | ||
LinkedListAlgo.mkStringForChain(list.headOpt.get) should equal((0 to 9).toArray.mkString("")) | ||
|
||
val reverseNode = LinkedListAlgo.reverse(list.headOpt.get) | ||
|
||
LinkedListAlgo.mkStringForChain(reverseNode) should equal((9 to 0 by -1).toArray.mkString("")) | ||
} | ||
|
||
it should "reverse a node for linked list with 1 node" in { | ||
val list = new SinglyLinkedList() | ||
|
||
list.insertTail(100) | ||
|
||
LinkedListAlgo.mkStringForChain(list.headOpt.get) should equal("100") | ||
|
||
val reverseNode = LinkedListAlgo.reverse(list.headOpt.get) | ||
|
||
LinkedListAlgo.mkStringForChain(reverseNode) should equal("100") | ||
} | ||
|
||
it should "check circle for circled linked list" in { | ||
|
||
val node1 = new Node(1, None) | ||
val node2 = new Node(2, None) | ||
val node3 = new Node(3, None) | ||
val node4 = new Node(4, None) | ||
val node5 = new Node(5, None) | ||
val node6 = new Node(6, None) | ||
|
||
//1->2->3->4->5->6->3 it's a circle | ||
//node1 is the head | ||
node1.next = Some(node2) | ||
node2.next = Some(node3) | ||
node3.next = Some(node4) | ||
node4.next = Some(node5) | ||
node5.next = Some(node6) | ||
node6.next = Some(node3) | ||
|
||
assert(LinkedListAlgo.checkCircle(node1)) | ||
} | ||
|
||
it should "check circle for none circled linked list" in { | ||
|
||
val node1 = new Node(1, None) | ||
val node2 = new Node(2, None) | ||
val node3 = new Node(3, None) | ||
val node4 = new Node(4, None) | ||
val node5 = new Node(5, None) | ||
val node6 = new Node(6, None) | ||
|
||
//1->2->3->4->5->6->null it's not a circle | ||
//node1 is the head | ||
node1.next = Some(node2) | ||
node2.next = Some(node3) | ||
node3.next = Some(node4) | ||
node4.next = Some(node5) | ||
node5.next = Some(node6) | ||
|
||
assert(!LinkedListAlgo.checkCircle(node1)) | ||
} | ||
|
||
} |