Skip to content

Commit 7a2575f

Browse files
committed
Add new exercise simple-linked-list
1 parent 2becaf4 commit 7a2575f

File tree

7 files changed

+161
-0
lines changed

7 files changed

+161
-0
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,3 +9,4 @@ build/
99
bin/configlet
1010
bin/configlet.exe
1111
gradle/
12+
/exercises/.nb-gradle/

config.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
"octal",
3939
"luhn",
4040
"pig-latin",
41+
"simple-linked-list",
4142
"linked-list",
4243
"nth-prime",
4344
"pascals-triangle"

exercises/settings.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ include 'prime-factors'
3030
include 'scrabble-score'
3131
include 'sieve'
3232
include 'simple-cipher'
33+
include 'simple-linked-list'
3334
include 'space-age'
3435
include 'strain'
3536
include 'triangle'
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
apply plugin: "java"
2+
apply plugin: "eclipse"
3+
apply plugin: "idea"
4+
5+
repositories {
6+
mavenCentral()
7+
}
8+
9+
dependencies {
10+
testCompile "junit:junit:4.10"
11+
testCompile "org.assertj:assertj-core:3.2.0"
12+
}
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
import java.util.NoSuchElementException;
2+
import java.util.Objects;
3+
4+
public class SimpleLinkedList {
5+
6+
class Element {
7+
8+
int value;
9+
Element next;
10+
11+
Element(int value) {
12+
this.value = value;
13+
}
14+
}
15+
16+
private Element head;
17+
private int size;
18+
19+
public SimpleLinkedList() {}
20+
21+
public SimpleLinkedList(int[] values) {
22+
for (int ii = values.length - 1; ii >= 0; ii--) {
23+
push(values[ii]);
24+
}
25+
}
26+
27+
public void push(int value) {
28+
Element newElement = new Element(value);
29+
this.size++;
30+
if (Objects.isNull(head)) {
31+
head = newElement;
32+
} else {
33+
newElement.next = head;
34+
head = newElement;
35+
}
36+
}
37+
38+
public int pop() {
39+
if (Objects.isNull(head)) {
40+
throw new NoSuchElementException();
41+
}
42+
int value = head.value;
43+
head = head.next;
44+
this.size--;
45+
return value;
46+
}
47+
48+
public void reverse() {
49+
Element current = head;
50+
Element next;
51+
Element previous = null;
52+
while (Objects.nonNull(current)) {
53+
next = current.next;
54+
current.next = previous;
55+
previous = current;
56+
current = next;
57+
}
58+
head = previous;
59+
}
60+
61+
public int[] asArray() {
62+
int[] result = new int[size];
63+
int index = 0;
64+
Element current = head;
65+
while (Objects.nonNull(current)) {
66+
result[index++] = current.value;
67+
current = current.next;
68+
}
69+
return result;
70+
}
71+
72+
public int size() {
73+
return this.size;
74+
}
75+
}

exercises/simple-linked-list/src/main/java/.keep

Whitespace-only changes.
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
import java.util.NoSuchElementException;
2+
import static org.assertj.core.api.Assertions.assertThat;
3+
import org.junit.Test;
4+
5+
public class SimpleLinkedListTest {
6+
7+
@Test
8+
public void aNewListIsEmpty() {
9+
SimpleLinkedList list = new SimpleLinkedList();
10+
assertThat(list.size()).isEqualTo(0);
11+
}
12+
13+
@Test
14+
public void canCreateFromArray() {
15+
int[] values = new int[]{1, 2, 3};
16+
SimpleLinkedList list = new SimpleLinkedList(values);
17+
assertThat(list.size()).isEqualTo(3);
18+
}
19+
20+
@Test(expected = NoSuchElementException.class)
21+
public void popOnEmptyListWillThrow() {
22+
SimpleLinkedList list = new SimpleLinkedList();
23+
list.pop();
24+
}
25+
26+
@Test
27+
public void popReturnsLastAddedElement() {
28+
SimpleLinkedList list = new SimpleLinkedList();
29+
list.push(9);
30+
list.push(8);
31+
assertThat(list.size()).isEqualTo(2);
32+
assertThat(list.pop()).isEqualTo(8);
33+
assertThat(list.pop()).isEqualTo(9);
34+
assertThat(list.size()).isEqualTo(0);
35+
}
36+
37+
@Test
38+
public void reverseReversesList() {
39+
SimpleLinkedList list = new SimpleLinkedList();
40+
list.push(9);
41+
list.push(8);
42+
list.push(7);
43+
list.push(6);
44+
list.push(5);
45+
list.reverse();
46+
assertThat(list.pop()).isEqualTo(9);
47+
assertThat(list.pop()).isEqualTo(8);
48+
assertThat(list.pop()).isEqualTo(7);
49+
assertThat(list.pop()).isEqualTo(6);
50+
assertThat(list.pop()).isEqualTo(5);
51+
}
52+
53+
@Test
54+
public void canReturnListAsArray() {
55+
SimpleLinkedList list = new SimpleLinkedList();
56+
list.push(9);
57+
list.push(8);
58+
list.push(7);
59+
list.push(6);
60+
list.push(5);
61+
int[] expected = {5, 6, 7, 8, 9};
62+
assertThat(list.asArray()).containsExactly(expected);
63+
}
64+
65+
@Test
66+
public void canReturnEmptyListAsEmptyArray() {
67+
SimpleLinkedList list = new SimpleLinkedList();
68+
int[] expected = {};
69+
assertThat(list.asArray()).containsExactly(expected);
70+
}
71+
}

0 commit comments

Comments
 (0)