-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathdoubleLinkedList.go
More file actions
136 lines (120 loc) · 2.55 KB
/
doubleLinkedList.go
File metadata and controls
136 lines (120 loc) · 2.55 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
// Package datastructures demonstration of doubly linked list in golang
package linkedList
import "errors"
type doubleLinkedListNode struct {
_value int
Next *doubleLinkedListNode
Previous *doubleLinkedListNode
}
type Doublelinkedlist struct {
Head *doubleLinkedListNode
}
// to avoid mistakes when using pointer vs struct for new node creation.
// Constructor
func newDoubleLinkedListNode(val int) *doubleLinkedListNode {
n := &doubleLinkedListNode{}
n._value = val
n.Next = nil
n.Previous = nil
return n
}
func (ll *Doublelinkedlist) Append(val int) {
n := newDoubleLinkedListNode(val)
if ll.Head == nil {
ll.Head = n
return
} else {
cur := ll.Head
for ; cur.Next != nil; cur = cur.Next {
}
cur.Next = n
n.Previous = cur
}
}
func (ll *Doublelinkedlist) InsertAtFront(val int) error {
return ll.InsertAt(0, val)
}
func (ll *Doublelinkedlist) InsertAt(index uint, val int) error {
newNode := newDoubleLinkedListNode(val)
if index == 0{
newNode.Next = ll.Head
ll.Head = newNode
return nil
} else {
next := ll.Head.Next
for i := uint(0); i < index-1; i++ {
if next == nil {
return errors.New("list is too small.")
}
next = next.Next
}
next.Previous.Next = newNode
newNode.Previous = next.Previous
next.Previous = newNode
newNode.Next = next
}
return nil
}
func (ll *Doublelinkedlist) DeleteAt(index uint) error {
if index == 0 && ll.Head != nil{
temp := ll.Head
ll.Head = ll.Head.Next
if ll.Head != nil {
ll.Head.Previous = nil
}
temp.Next = nil
} else {
next := ll.Head
for i := uint(0); i < index-1; i++ {
if next == nil {
return errors.New("list is too small.")
}
next = next.Next
}
if next != nil {
if next.Previous != nil {
next.Previous.Next = next.Next
}
if next.Next != nil {
next.Next.Previous = next.Previous
next.Next = next.Next.Next
}
next.Previous = nil
} else {
return errors.New("list is too small.")
}
}
return nil
}
func (ll *Doublelinkedlist) DeleteAtEnd() error {
// no item
if ll.Head == nil {
return errors.New("list is too small.")
} else {
cur := ll.Head
for ; cur.Next.Next != nil; cur = cur.Next {
}
cur.Next.Previous = nil
cur.Next = nil
}
return nil
}
func (ll *Doublelinkedlist) Count() int {
var ctr int = 0
for cur := ll.Head; cur != nil; cur = cur.Next {
ctr += 1
}
return ctr
}
func (ll *Doublelinkedlist) Reverse() {
var prev, next *doubleLinkedListNode
cur := ll.Head
for cur != nil {
next = cur.Next
cur.Next = prev
cur.Previous = next
prev = cur
cur = next
}
ll.Head = prev
}