Skip to content

Commit a6110c0

Browse files
committed
Merge branch 'release/v1.0.20.0'
2 parents b802490 + 39464e1 commit a6110c0

File tree

4 files changed

+76
-1
lines changed

4 files changed

+76
-1
lines changed

README.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,11 @@ to keep up with the language and learn how to use the Scala test library as well
3333
* Partition list
3434
* Add binary
3535
* Contains duplicate
36+
* Middle of linked list
3637

3738
## Versions
39+
* v1.0.20.0 (10/06/2018) - Added Middle of linked list exercise.
40+
3841
* v1.0.19.0 (10/04/2018) - Added Contains duplicate exercise.
3942

4043
* v1.0.18.0 (09/26/2018) - Added add binary exercise.

build.sbt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ lazy val root = (project in file(".")).
55
inThisBuild(List(
66
organization := "org.codecraftlabs",
77
scalaVersion := "2.12.7",
8-
version := "1.0.19.0"
8+
version := "1.0.20.0"
99
)),
1010
name := "leetcode-scala",
1111
libraryDependencies += scalaTest % Test,
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package org.codecraftlabs.leetcode
2+
3+
object MiddleLinkedList {
4+
def middleNode(head: ListNode): ListNode = {
5+
if(head == null) null
6+
7+
val size = length(head)
8+
val middle = size / 2
9+
elementAt(middle, head)
10+
}
11+
12+
private def length(root: ListNode): Int = {
13+
count(root)
14+
}
15+
16+
private def count(node: ListNode): Int = {
17+
if(node != null) {
18+
1 + count(node.next)
19+
} else 0
20+
}
21+
22+
private def elementAt(position: Int, node: ListNode): ListNode = {
23+
var counter = 0
24+
var item = node
25+
while (counter < position) {
26+
item = item.next
27+
counter += 1
28+
}
29+
item
30+
}
31+
32+
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package org.codecraftlabs.leetcode
2+
3+
import org.codecraftlabs.leetcode.MiddleLinkedList.middleNode
4+
import org.scalatest.{FlatSpec, Matchers}
5+
6+
class MiddleLinkedListSpec extends FlatSpec with Matchers {
7+
"Null list" should "return null" in {
8+
middleNode(null) shouldBe null
9+
}
10+
11+
"Single node list" should "return first node" in {
12+
val item = new ListNode(1)
13+
val result = middleNode(item)
14+
result should not be null
15+
result.x shouldEqual 1
16+
}
17+
18+
"Even sized list" should "return first element of second half of the list" in {
19+
val firstNode = new ListNode(0)
20+
val secondNode = new ListNode(1)
21+
firstNode.next = secondNode
22+
23+
val result = middleNode(firstNode)
24+
result should not be null
25+
result.x should equal(1)
26+
}
27+
28+
"Odd size list" should "return exactly the middle element" in {
29+
val firstNode = new ListNode(0)
30+
val secondNode = new ListNode(1)
31+
val thirdNode = new ListNode(2)
32+
33+
firstNode.next = secondNode
34+
secondNode.next = thirdNode
35+
36+
val result = middleNode(firstNode)
37+
result should not be null
38+
result.x should equal(1)
39+
}
40+
}

0 commit comments

Comments
 (0)