Skip to content

Commit 7780537

Browse files
Adding doublylinkedlist in go
1 parent 372877b commit 7780537

File tree

3 files changed

+131
-5
lines changed

3 files changed

+131
-5
lines changed

Go/linkedlist/doublyLinkedList.go

Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
package linkedlist
2+
3+
import "fmt"
4+
5+
type DoublyNode struct {
6+
Val int
7+
Next *DoublyNode
8+
Prev *DoublyNode
9+
}
10+
11+
type DoublyLinkedList struct {
12+
Head *DoublyNode
13+
Len int
14+
}
15+
16+
func (l *DoublyLinkedList) Print(msg string) {
17+
pointer := l.Head
18+
fmt.Println("\n*** PRINTING:", msg, " ****\n")
19+
for pointer != nil {
20+
fmt.Print(pointer.Prev, "[", pointer.Val, "]", pointer.Next, "| -> |")
21+
pointer = pointer.Next
22+
}
23+
}
24+
25+
func (l *DoublyLinkedList) InsertAtEnd(val int) {
26+
n := &DoublyNode{Val: val, Next: nil, Prev: nil}
27+
if l.Head == nil {
28+
l.Head = n
29+
return
30+
}
31+
32+
pointer := l.Head
33+
previous := pointer
34+
for pointer != nil {
35+
previous = pointer
36+
pointer = pointer.Next
37+
}
38+
previous.Next = n
39+
n.Prev = previous
40+
}
41+
42+
func (l *DoublyLinkedList) InsertAtStart(val int) {
43+
n := &DoublyNode{Val: val, Prev: nil, Next: nil}
44+
if l.Head == nil {
45+
l.Head = n
46+
return
47+
}
48+
49+
l.Head.Prev = n
50+
tempHead := l.Head
51+
l.Head = n
52+
l.Head.Next = tempHead
53+
}
54+
55+
func (l *DoublyLinkedList) DeleteAtStart() {
56+
if l.Head == nil {
57+
return
58+
}
59+
previous := l.Head.Prev
60+
l.Head = l.Head.Next
61+
l.Head.Prev = previous
62+
}
63+
64+
func (l *DoublyLinkedList) InsertAtIndex(index, val int) {
65+
count := 0
66+
n := &DoublyNode{Val: val, Next: nil, Prev: nil}
67+
pointer := l.Head
68+
previous := pointer
69+
70+
for ; pointer != nil; count++ {
71+
if count == index {
72+
n.Next = previous.Next
73+
n.Prev = previous
74+
previous.Next = n
75+
pointer.Prev = n
76+
return
77+
}
78+
previous = pointer
79+
pointer = pointer.Next
80+
81+
}
82+
}
83+
84+
func (l *DoublyLinkedList) DeleteAtEnd() {
85+
if l.Head == nil {
86+
return
87+
}
88+
pointer := l.Head
89+
previous := pointer
90+
for pointer.Next != nil {
91+
previous = pointer
92+
pointer = pointer.Next
93+
}
94+
previous.Next = nil
95+
}
96+
97+
func (l *DoublyLinkedList) DeleteAtIndex(index int) {
98+
count := 0
99+
pointer := l.Head
100+
previous := pointer
101+
102+
for ; pointer != nil; count++ {
103+
if count == index {
104+
previous.Next = pointer.Next
105+
pointer.Prev = previous
106+
}
107+
previous = pointer
108+
pointer = pointer.Next
109+
}
110+
}

Go/linkedlist/singleLinkedList.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ func (l *SinglyLinkedList) DeleteAtEnd() {
7878
}
7979
pointer := l.Head
8080
previous := pointer
81-
for pointer.Next == nil {
81+
for pointer.Next != nil {
8282
previous = pointer
8383
pointer = pointer.Next
8484
}

Go/main.go

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,26 @@ func main() {
1313
l.InsertAtStart(100)
1414
l.InsertAtEnd(200)
1515
l.InsertAtIndex(1, 3)
16-
l.Print() // 100 3 5 200
17-
l.DeleteAtIndex(2) // 100 3 200
18-
l.DeleteAtStart() // 3 200
19-
l.DeleteAtEnd() // 3
16+
l.Print() // 100 3 5 200
17+
l.DeleteAtIndex(2) // 100 3 200
18+
l.DeleteAtStart() // 3 200
19+
l.InsertAtStart(100) // 100 3 200
20+
l.DeleteAtEnd() // 100 3
2021
l.Print()
2122

23+
fmt.Println("\n***** Doubly LinkedList *******")
24+
l2 := linkedlist.DoublyLinkedList{}
25+
l2.InsertAtEnd(5) //5
26+
l2.InsertAtStart(100) //100 5
27+
l2.Print("Insertion at Start & End")
28+
l2.InsertAtEnd(200) // 100 5 200
29+
l2.Print("Insertion at End")
30+
l2.DeleteAtStart() // 5 200
31+
l2.InsertAtIndex(1, 10) // 5 10 200
32+
l2.Print("Deletion at Start and Insert at Index")
33+
l2.DeleteAtEnd()
34+
l2.Print("Delete at End") // 5 10
35+
l2.DeleteAtIndex(1)
36+
l2.Print("Delete at Index 1") // 5
37+
2238
}

0 commit comments

Comments
 (0)