Skip to content

Commit 461123f

Browse files
committed
add linkedlists
1 parent c7447ef commit 461123f

File tree

2 files changed

+279
-0
lines changed

2 files changed

+279
-0
lines changed
Lines changed: 156 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,156 @@
1+
// demonstration of doubly linked list in golang
2+
3+
package doublelinkedlist
4+
5+
// package main
6+
7+
import "fmt"
8+
9+
type node struct {
10+
val int
11+
next *node
12+
prev *node
13+
}
14+
15+
type doublelinkedlist struct {
16+
head *node
17+
}
18+
19+
// to avoid mistakes when using pointer vs struct for new node creation
20+
func newNode(val int) *node {
21+
n := &node{}
22+
n.val = val
23+
n.next = nil
24+
n.prev = nil
25+
return n
26+
}
27+
28+
func (ll *doublelinkedlist) addAtBeg(val int) {
29+
n := newNode(val)
30+
n.next = ll.head
31+
ll.head = n
32+
}
33+
34+
func (ll *doublelinkedlist) addAtEnd(val int) {
35+
n := newNode(val)
36+
37+
if ll.head == nil {
38+
ll.head = n
39+
return
40+
}
41+
42+
cur := ll.head
43+
for ; cur.next != nil; cur = cur.next {
44+
}
45+
cur.next = n
46+
n.prev = cur
47+
}
48+
49+
func (ll *doublelinkedlist) delAtBeg() int {
50+
if ll.head == nil {
51+
return -1
52+
}
53+
54+
cur := ll.head
55+
ll.head = cur.next
56+
57+
if ll.head != nil {
58+
ll.head.prev = nil
59+
}
60+
61+
return cur.val
62+
}
63+
64+
func (ll *doublelinkedlist) delAtEnd() int {
65+
// no item
66+
if ll.head == nil {
67+
return -1
68+
}
69+
70+
// only one item
71+
if ll.head.next == nil {
72+
return ll.delAtBeg()
73+
}
74+
75+
// more than one, go to second last
76+
cur := ll.head
77+
for ; cur.next.next != nil; cur = cur.next {
78+
}
79+
80+
retval := cur.next.val
81+
cur.next = nil
82+
return retval
83+
}
84+
85+
func (ll *doublelinkedlist) count() int {
86+
var ctr int = 0
87+
88+
for cur := ll.head; cur != nil; cur = cur.next {
89+
ctr += 1
90+
}
91+
92+
return ctr
93+
}
94+
95+
func (ll *doublelinkedlist) reverse() {
96+
var prev, next *node
97+
cur := ll.head
98+
99+
for cur != nil {
100+
next = cur.next
101+
cur.next = prev
102+
cur.prev = next
103+
prev = cur
104+
cur = next
105+
}
106+
107+
ll.head = prev
108+
}
109+
110+
func (ll *doublelinkedlist) display() {
111+
for cur := ll.head; cur != nil; cur = cur.next {
112+
fmt.Print(cur.val, " ")
113+
}
114+
115+
fmt.Print("\n")
116+
}
117+
118+
func (ll *doublelinkedlist) displayReverse() {
119+
if ll.head == nil {
120+
return
121+
}
122+
var cur *node
123+
for cur = ll.head; cur.next != nil; cur = cur.next {
124+
}
125+
126+
for ; cur != nil; cur = cur.prev {
127+
fmt.Print(cur.val, " ")
128+
}
129+
130+
fmt.Print("\n")
131+
}
132+
133+
/*
134+
func main() {
135+
ll := doublelinkedlist{}
136+
137+
ll.addAtBeg(10)
138+
ll.addAtEnd(20)
139+
ll.display()
140+
ll.addAtBeg(30)
141+
ll.display()
142+
143+
ll.reverse()
144+
ll.display()
145+
ll.displayReverse()
146+
147+
fmt.Print(ll.delAtBeg(), "\n")
148+
fmt.Print(ll.delAtEnd(), "\n")
149+
fmt.Print("Display")
150+
ll.display()
151+
fmt.Print(ll.delAtBeg(), "\n")
152+
ll.display()
153+
fmt.Print(ll.delAtBeg(), "\n")
154+
ll.display()
155+
}
156+
*/
Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
1+
// demonstration of singly linked list in golang
2+
3+
package singlelinkedlist
4+
5+
// package main
6+
7+
import "fmt"
8+
9+
type node struct {
10+
val int
11+
next *node
12+
}
13+
14+
type singlelinkedlist struct {
15+
head *node
16+
}
17+
18+
// to avoid mistakes when using pointer vs struct for new node creation
19+
func newNode(val int) *node {
20+
return &node{val, nil}
21+
}
22+
23+
func (ll *singlelinkedlist) addAtBeg(val int) {
24+
n := newNode(val)
25+
n.next = ll.head
26+
ll.head = n
27+
}
28+
29+
func (ll *singlelinkedlist) addAtEnd(val int) {
30+
n := newNode(val)
31+
32+
if ll.head == nil {
33+
ll.head = n
34+
return
35+
}
36+
37+
cur := ll.head
38+
for ; cur.next != nil; cur = cur.next {
39+
}
40+
cur.next = n
41+
}
42+
43+
func (ll *singlelinkedlist) delAtBeg() int {
44+
if ll.head == nil {
45+
return -1
46+
}
47+
48+
cur := ll.head
49+
ll.head = cur.next
50+
51+
return cur.val
52+
}
53+
54+
func (ll *singlelinkedlist) delAtEnd() int {
55+
if ll.head == nil {
56+
return -1
57+
}
58+
59+
if ll.head.next == nil {
60+
return ll.delAtBeg()
61+
}
62+
63+
cur := ll.head
64+
65+
for ; cur.next.next != nil; cur = cur.next {
66+
}
67+
68+
retval := cur.next.val
69+
cur.next = nil
70+
return retval
71+
72+
}
73+
74+
func (ll *singlelinkedlist) count() int {
75+
var ctr int = 0
76+
77+
for cur := ll.head; cur != nil; cur = cur.next {
78+
ctr += 1
79+
}
80+
81+
return ctr
82+
}
83+
84+
func (ll *singlelinkedlist) reverse() {
85+
var prev, next *node
86+
cur := ll.head
87+
88+
for cur != nil {
89+
next = cur.next
90+
cur.next = prev
91+
prev = cur
92+
cur = next
93+
}
94+
95+
ll.head = prev
96+
}
97+
98+
func (ll *singlelinkedlist) display() {
99+
for cur := ll.head; cur != nil; cur = cur.next {
100+
fmt.Print(cur.val, " ")
101+
}
102+
103+
fmt.Print("\n")
104+
}
105+
106+
// func main() {
107+
// ll := singlelinkedlist{}
108+
109+
// ll.addAtBeg(10)
110+
// ll.addAtEnd(20)
111+
// ll.display()
112+
// ll.addAtBeg(30)
113+
// ll.display()
114+
// ll.reverse()
115+
// ll.display()
116+
117+
// fmt.Print(ll.delAtBeg(), "\n")
118+
// ll.display()
119+
120+
// fmt.Print(ll.delAtEnd(), "\n")
121+
// ll.display()
122+
123+
// }

0 commit comments

Comments
 (0)