Skip to content

Commit da8048a

Browse files
committed
Add linked list
Removed singly linked list; this discussion covers both.
1 parent c760b9d commit da8048a

File tree

18 files changed

+1380
-495
lines changed

18 files changed

+1380
-495
lines changed

Singly Linked List/LinkedListTests/LinkedListTests.xcodeproj/project.pbxproj renamed to Linked List/LinkedList Tests/LinkedList.xcodeproj/project.pbxproj

Lines changed: 105 additions & 105 deletions
Large diffs are not rendered by default.
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
//
2+
// AppDelegate.swift
3+
// LinkedList
4+
//
5+
// Created by Matthijs Hollemans on 03-02-16.
6+
// Copyright © 2016 Swift Algorithm Club. All rights reserved.
7+
//
8+
9+
import Cocoa
10+
11+
@NSApplicationMain
12+
class AppDelegate: NSObject, NSApplicationDelegate {
13+
14+
@IBOutlet weak var window: NSWindow!
15+
16+
17+
func applicationDidFinishLaunching(aNotification: NSNotification) {
18+
// Insert code here to initialize your application
19+
}
20+
21+
func applicationWillTerminate(aNotification: NSNotification) {
22+
// Insert code here to tear down your application
23+
}
24+
25+
26+
}
27+

Singly Linked List/LinkedListTests/LinkedListTests/Base.lproj/MainMenu.xib renamed to Linked List/LinkedList Tests/LinkedList/Base.lproj/MainMenu.xib

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,11 @@
1919
<customObject id="YLy-65-1bz" customClass="NSFontManager"/>
2020
<menu title="Main Menu" systemMenu="main" id="AYu-sK-qS6">
2121
<items>
22-
<menuItem title="LinkedListTests" id="1Xt-HY-uBw">
22+
<menuItem title="LinkedList" id="1Xt-HY-uBw">
2323
<modifierMask key="keyEquivalentModifierMask"/>
24-
<menu key="submenu" title="LinkedListTests" systemMenu="apple" id="uQy-DD-JDr">
24+
<menu key="submenu" title="LinkedList" systemMenu="apple" id="uQy-DD-JDr">
2525
<items>
26-
<menuItem title="About LinkedListTests" id="5kV-Vb-QxS">
26+
<menuItem title="About LinkedList" id="5kV-Vb-QxS">
2727
<modifierMask key="keyEquivalentModifierMask"/>
2828
<connections>
2929
<action selector="orderFrontStandardAboutPanel:" target="-1" id="Exp-CZ-Vem"/>
@@ -37,7 +37,7 @@
3737
<menu key="submenu" title="Services" systemMenu="services" id="hz9-B4-Xy5"/>
3838
</menuItem>
3939
<menuItem isSeparatorItem="YES" id="4je-JR-u6R"/>
40-
<menuItem title="Hide LinkedListTests" keyEquivalent="h" id="Olw-nP-bQN">
40+
<menuItem title="Hide LinkedList" keyEquivalent="h" id="Olw-nP-bQN">
4141
<connections>
4242
<action selector="hide:" target="-1" id="PnN-Uc-m68"/>
4343
</connections>
@@ -55,7 +55,7 @@
5555
</connections>
5656
</menuItem>
5757
<menuItem isSeparatorItem="YES" id="kCx-OE-vgT"/>
58-
<menuItem title="Quit LinkedListTests" keyEquivalent="q" id="4sb-4s-VLi">
58+
<menuItem title="Quit LinkedList" keyEquivalent="q" id="4sb-4s-VLi">
5959
<connections>
6060
<action selector="terminate:" target="-1" id="Te7-pn-YzF"/>
6161
</connections>
@@ -656,7 +656,7 @@
656656
<modifierMask key="keyEquivalentModifierMask"/>
657657
<menu key="submenu" title="Help" systemMenu="help" id="F2S-fz-NVQ">
658658
<items>
659-
<menuItem title="LinkedListTests Help" keyEquivalent="?" id="FKE-Sm-Kum">
659+
<menuItem title="LinkedList Help" keyEquivalent="?" id="FKE-Sm-Kum">
660660
<connections>
661661
<action selector="showHelp:" target="-1" id="y7X-2Q-9no"/>
662662
</connections>
@@ -666,7 +666,7 @@
666666
</menuItem>
667667
</items>
668668
</menu>
669-
<window title="LinkedListTests" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" releasedWhenClosed="NO" animationBehavior="default" id="QvC-M9-y7g">
669+
<window title="LinkedList" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" releasedWhenClosed="NO" animationBehavior="default" id="QvC-M9-y7g">
670670
<windowStyleMask key="styleMask" titled="YES" closable="YES" miniaturizable="YES" resizable="YES"/>
671671
<windowPositionMask key="initialPositionMask" leftStrut="YES" rightStrut="YES" topStrut="YES" bottomStrut="YES"/>
672672
<rect key="contentRect" x="335" y="390" width="480" height="360"/>

Singly Linked List/LinkedListTests/LinkedListTests/Info.plist renamed to Linked List/LinkedList Tests/LinkedList/Info.plist

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
<key>LSMinimumSystemVersion</key>
2626
<string>$(MACOSX_DEPLOYMENT_TARGET)</string>
2727
<key>NSHumanReadableCopyright</key>
28-
<string>Copyright © 2016 Mac Bellingrath. All rights reserved.</string>
28+
<string>Copyright © 2016 Swift Algorithm Club. All rights reserved.</string>
2929
<key>NSMainNibFile</key>
3030
<string>MainMenu</string>
3131
<key>NSPrincipalClass</key>
Lines changed: 252 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,252 @@
1+
import XCTest
2+
@testable import LinkedList
3+
4+
class LinkedListTest: XCTestCase {
5+
let numbers = [8, 2, 10, 9, 7, 5]
6+
7+
private func buildList() -> LinkedList<Int> {
8+
let list = LinkedList<Int>()
9+
for number in numbers {
10+
list.append(number)
11+
}
12+
return list
13+
}
14+
15+
func testEmptyList() {
16+
let list = LinkedList<Int>()
17+
XCTAssertTrue(list.isEmpty)
18+
XCTAssertEqual(list.count, 0)
19+
XCTAssertNil(list.first)
20+
XCTAssertNil(list.last)
21+
}
22+
23+
func testListWithOneElement() {
24+
let list = LinkedList<Int>()
25+
list.append(123)
26+
27+
XCTAssertFalse(list.isEmpty)
28+
XCTAssertEqual(list.count, 1)
29+
30+
XCTAssertNotNil(list.first)
31+
XCTAssertNil(list.first!.previous)
32+
XCTAssertNil(list.first!.next)
33+
XCTAssertEqual(list.first!.value, 123)
34+
35+
XCTAssertNotNil(list.last)
36+
XCTAssertNil(list.last!.previous)
37+
XCTAssertNil(list.last!.next)
38+
XCTAssertEqual(list.last!.value, 123)
39+
40+
XCTAssertTrue(list.first === list.last)
41+
}
42+
43+
func testListWithTwoElements() {
44+
let list = LinkedList<Int>()
45+
list.append(123)
46+
list.append(456)
47+
48+
XCTAssertEqual(list.count, 2)
49+
50+
XCTAssertNotNil(list.first)
51+
XCTAssertEqual(list.first!.value, 123)
52+
53+
XCTAssertNotNil(list.last)
54+
XCTAssertEqual(list.last!.value, 456)
55+
56+
XCTAssertTrue(list.first !== list.last)
57+
58+
XCTAssertNil(list.first!.previous)
59+
XCTAssertTrue(list.first!.next === list.last)
60+
XCTAssertTrue(list.last!.previous === list.first)
61+
XCTAssertNil(list.last!.next)
62+
}
63+
64+
func testListWithThreeElements() {
65+
let list = LinkedList<Int>()
66+
list.append(123)
67+
list.append(456)
68+
list.append(789)
69+
70+
XCTAssertEqual(list.count, 3)
71+
72+
XCTAssertNotNil(list.first)
73+
XCTAssertEqual(list.first!.value, 123)
74+
75+
let second = list.first!.next
76+
XCTAssertNotNil(second)
77+
XCTAssertEqual(second!.value, 456)
78+
79+
XCTAssertNotNil(list.last)
80+
XCTAssertEqual(list.last!.value, 789)
81+
82+
XCTAssertNil(list.first!.previous)
83+
XCTAssertTrue(list.first!.next === second)
84+
XCTAssertTrue(second!.previous === list.first)
85+
XCTAssertTrue(second!.next === list.last)
86+
XCTAssertTrue(list.last!.previous === second)
87+
XCTAssertNil(list.last!.next)
88+
}
89+
90+
func testNodeAtIndexInEmptyList() {
91+
let list = LinkedList<Int>()
92+
let node = list.nodeAtIndex(0)
93+
XCTAssertNil(node)
94+
}
95+
96+
func testNodeAtIndexInListWithOneElement() {
97+
let list = LinkedList<Int>()
98+
list.append(123)
99+
100+
let node = list.nodeAtIndex(0)
101+
XCTAssertNotNil(node)
102+
XCTAssertEqual(node!.value, 123)
103+
XCTAssertTrue(node === list.first)
104+
}
105+
106+
func testNodeAtIndex() {
107+
let list = buildList()
108+
109+
let nodeCount = list.count
110+
XCTAssertEqual(nodeCount, numbers.count)
111+
112+
XCTAssertNil(list.nodeAtIndex(-1))
113+
XCTAssertNil(list.nodeAtIndex(nodeCount))
114+
115+
let first = list.nodeAtIndex(0)
116+
XCTAssertNotNil(first)
117+
XCTAssertTrue(first === list.first)
118+
XCTAssertEqual(first!.value, numbers[0])
119+
120+
let last = list.nodeAtIndex(nodeCount - 1)
121+
XCTAssertNotNil(last)
122+
XCTAssertTrue(last === list.last)
123+
XCTAssertEqual(last!.value, numbers[nodeCount - 1])
124+
125+
for i in 0..<nodeCount {
126+
let node = list.nodeAtIndex(i)
127+
XCTAssertNotNil(node)
128+
XCTAssertEqual(node!.value, numbers[i])
129+
}
130+
}
131+
132+
func testSubscript() {
133+
let list = buildList()
134+
for i in 0 ..< list.count {
135+
XCTAssertEqual(list[i], numbers[i])
136+
}
137+
}
138+
139+
func testInsertAtIndexInEmptyList() {
140+
let list = LinkedList<Int>()
141+
list.insert(123, atIndex: 0)
142+
143+
XCTAssertFalse(list.isEmpty)
144+
XCTAssertEqual(list.count, 1)
145+
146+
let node = list.nodeAtIndex(0)
147+
XCTAssertNotNil(node)
148+
XCTAssertEqual(node!.value, 123)
149+
}
150+
151+
func testInsertAtIndex() {
152+
let list = buildList()
153+
let prev = list.nodeAtIndex(2)
154+
let next = list.nodeAtIndex(3)
155+
let nodeCount = list.count
156+
157+
list.insert(444, atIndex: 3)
158+
159+
let node = list.nodeAtIndex(3)
160+
XCTAssertNotNil(node)
161+
XCTAssertEqual(node!.value, 444)
162+
XCTAssertEqual(nodeCount + 1, list.count)
163+
164+
XCTAssertFalse(prev === node)
165+
XCTAssertFalse(next === node)
166+
XCTAssertTrue(prev!.next === node)
167+
XCTAssertTrue(next!.previous === node)
168+
}
169+
170+
func testRemoveAtIndexOnListWithOneElement() {
171+
let list = LinkedList<Int>()
172+
list.append(123)
173+
174+
let value = list.removeAtIndex(0)
175+
XCTAssertEqual(value, 123)
176+
177+
XCTAssertTrue(list.isEmpty)
178+
XCTAssertEqual(list.count, 0)
179+
XCTAssertNil(list.first)
180+
XCTAssertNil(list.last)
181+
}
182+
183+
func testRemoveAtIndex() {
184+
let list = buildList()
185+
let prev = list.nodeAtIndex(2)
186+
let next = list.nodeAtIndex(3)
187+
let nodeCount = list.count
188+
189+
list.insert(444, atIndex: 3)
190+
191+
let value = list.removeAtIndex(3)
192+
XCTAssertEqual(value, 444)
193+
194+
let node = list.nodeAtIndex(3)
195+
XCTAssertTrue(next === node)
196+
XCTAssertTrue(prev!.next === node)
197+
XCTAssertTrue(node!.previous === prev)
198+
XCTAssertEqual(nodeCount, list.count)
199+
}
200+
201+
func testRemoveLastOnListWithOneElement() {
202+
let list = LinkedList<Int>()
203+
list.append(123)
204+
205+
let value = list.removeLast()
206+
XCTAssertEqual(value, 123)
207+
208+
XCTAssertTrue(list.isEmpty)
209+
XCTAssertEqual(list.count, 0)
210+
XCTAssertNil(list.first)
211+
XCTAssertNil(list.last)
212+
}
213+
214+
func testRemoveLast() {
215+
let list = buildList()
216+
let last = list.last
217+
let prev = last!.previous
218+
let nodeCount = list.count
219+
220+
let value = list.removeLast()
221+
XCTAssertEqual(value, 5)
222+
223+
XCTAssertNil(last!.previous)
224+
XCTAssertNil(last!.next)
225+
226+
XCTAssertNil(prev!.next)
227+
XCTAssertTrue(list.last === prev)
228+
XCTAssertEqual(nodeCount - 1, list.count)
229+
}
230+
231+
func testRemoveAll() {
232+
let list = buildList()
233+
list.removeAll()
234+
XCTAssertTrue(list.isEmpty)
235+
XCTAssertEqual(list.count, 0)
236+
XCTAssertNil(list.first)
237+
XCTAssertNil(list.last)
238+
}
239+
240+
func testReverseLinkedList() {
241+
let list = buildList()
242+
let first = list.first
243+
let last = list.last
244+
let nodeCount = list.count
245+
246+
list.reverse()
247+
248+
XCTAssertTrue(first === list.last)
249+
XCTAssertTrue(last === list.first)
250+
XCTAssertEqual(nodeCount, list.count)
251+
}
252+
}

0 commit comments

Comments
 (0)