Skip to content

Commit 33066f4

Browse files
committed
Changed linked list to make it extensible and accept any data type. Also added some unit tests.
Signed-off-by: Jobin John <[email protected]>
1 parent 727747d commit 33066f4

File tree

3 files changed

+192
-123
lines changed

3 files changed

+192
-123
lines changed

data-structures/linked-list/single-linkedlist.go

Lines changed: 0 additions & 123 deletions
This file was deleted.
Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
1+
package singlelinkedlist
2+
3+
// demonstration of singly linked list in golang
4+
import "fmt"
5+
6+
type node struct {
7+
Val interface{}
8+
Next *node
9+
}
10+
11+
type singlelinkedlist struct {
12+
length int
13+
Head *node
14+
}
15+
16+
// CreateList returns a new instance of a linked list
17+
func CreateList() *singlelinkedlist {
18+
return &singlelinkedlist{}
19+
}
20+
21+
// to avoid mistakes when using pointer vs struct for new node creation
22+
func newNode(val interface{}) *node {
23+
return &node{val, nil}
24+
}
25+
26+
func (ll *singlelinkedlist) AddAtBeg(val interface{}) {
27+
n := newNode(val)
28+
n.Next = ll.Head
29+
ll.Head = n
30+
ll.length++
31+
}
32+
33+
func (ll *singlelinkedlist) AddAtEnd(val int) {
34+
n := newNode(val)
35+
36+
if ll.Head == nil {
37+
ll.Head = n
38+
ll.length++
39+
return
40+
}
41+
42+
cur := ll.Head
43+
for ; cur.Next != nil; cur = cur.Next {
44+
}
45+
cur.Next = n
46+
ll.length++
47+
}
48+
49+
func (ll *singlelinkedlist) DelAtBeg() interface{} {
50+
if ll.Head == nil {
51+
return -1
52+
}
53+
54+
cur := ll.Head
55+
ll.Head = cur.Next
56+
ll.length--
57+
58+
return cur.Val
59+
}
60+
61+
func (ll *singlelinkedlist) DelAtEnd() interface{} {
62+
if ll.Head == nil {
63+
return -1
64+
}
65+
66+
if ll.Head.Next == nil {
67+
return ll.DelAtBeg()
68+
}
69+
70+
cur := ll.Head
71+
72+
for ; cur.Next.Next != nil; cur = cur.Next {
73+
}
74+
75+
retval := cur.Next.Val
76+
cur.Next = nil
77+
ll.length--
78+
return retval
79+
80+
}
81+
82+
func (ll *singlelinkedlist) Count() int {
83+
return ll.length
84+
}
85+
86+
func (ll *singlelinkedlist) Reverse() {
87+
var prev, Next *node
88+
cur := ll.Head
89+
90+
for cur != nil {
91+
Next = cur.Next
92+
cur.Next = prev
93+
prev = cur
94+
cur = Next
95+
}
96+
97+
ll.Head = prev
98+
}
99+
100+
func (ll *singlelinkedlist) Display() {
101+
for cur := ll.Head; cur != nil; cur = cur.Next {
102+
fmt.Print(cur.Val, " ")
103+
}
104+
105+
fmt.Print("\n")
106+
}
107+
108+
// func main() {
109+
// ll := singlelinkedlist{}
110+
111+
// ll.addAtBeg(10)
112+
// ll.addAtEnd(20)
113+
// ll.display()
114+
// ll.addAtBeg(30)
115+
// ll.display()
116+
// ll.reverse()
117+
// ll.display()
118+
119+
// fmt.Print(ll.delAtBeg(), "\n")
120+
// ll.display()
121+
122+
// fmt.Print(ll.delAtEnd(), "\n")
123+
// ll.display()
124+
125+
// }
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
package singlelinkedlist
2+
3+
import (
4+
"reflect"
5+
"testing"
6+
)
7+
8+
func TestLinkedList(t *testing.T) {
9+
list := CreateList()
10+
list.AddAtBeg(1)
11+
list.AddAtBeg(2)
12+
list.AddAtBeg(3)
13+
14+
t.Run("Test AddAtBeg()", func(t *testing.T) {
15+
want := []interface{}{3, 2, 1}
16+
got := []interface{}{}
17+
current := list.Head
18+
got = append(got, current.Val)
19+
for current.Next != nil {
20+
current = current.Next
21+
got = append(got, current.Val)
22+
}
23+
if !reflect.DeepEqual(got, want) {
24+
t.Errorf("got: %v, want: %v", got, want)
25+
}
26+
})
27+
28+
list.AddAtEnd(4)
29+
30+
t.Run("Test AddAtEnd()", func(t *testing.T) {
31+
want := []interface{}{3, 2, 1, 4}
32+
got := []interface{}{}
33+
current := list.Head
34+
got = append(got, current.Val)
35+
for current.Next != nil {
36+
current = current.Next
37+
got = append(got, current.Val)
38+
}
39+
if !reflect.DeepEqual(got, want) {
40+
t.Errorf("got: %v, want: %v", got, want)
41+
}
42+
})
43+
44+
t.Run("Test DelAtBeg()", func(t *testing.T) {
45+
want := interface{}(3)
46+
got := list.DelAtBeg()
47+
if got != want {
48+
t.Errorf("got: %v, want: %v", got, want)
49+
}
50+
})
51+
52+
t.Run("Test DelAtEnd()", func(t *testing.T) {
53+
want := interface{}(4)
54+
got := list.DelAtEnd()
55+
if got != want {
56+
t.Errorf("got: %v, want: %v", got, want)
57+
}
58+
})
59+
60+
t.Run("Test Count()", func(t *testing.T) {
61+
want := 2
62+
got := list.Count()
63+
if got != want {
64+
t.Errorf("got: %v, want: %v", got, want)
65+
}
66+
})
67+
}

0 commit comments

Comments
 (0)