-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdll.go
117 lines (96 loc) · 2.13 KB
/
dll.go
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
package hermeskv
import (
"fmt"
)
type Node struct {
val interface{}
key string
next *Node
prev *Node
}
func getNode(key string, val interface{}, prev, next *Node) *Node {
return &Node{
key: key,
val: val,
next: next,
prev: prev,
}
}
type DoublyLinkedList struct {
// head and tail nodes are basically the boundaries pointing to the first and last element
headNode *Node
tailNode *Node
capacity int
}
func getDLL() *DoublyLinkedList {
dll := &DoublyLinkedList{
headNode: getNode("headNode", -1, nil, nil),
tailNode: getNode("tailNode", -1, nil, nil),
capacity: 0,
}
// init head and tail nodes
dll.headNode.prev = nil
dll.headNode.next = dll.tailNode
dll.tailNode.next = nil
dll.tailNode.prev = dll.headNode
return dll
}
func (dll *DoublyLinkedList) addNode(newNode *Node) *Node {
dll.capacity++
// insert in between tail and head
prevNode := dll.tailNode.prev
dll.tailNode.prev = newNode
newNode.next = dll.tailNode
newNode.prev = prevNode
prevNode.next = newNode
return newNode
}
func (dll *DoublyLinkedList) display() {
curNode := dll.headNode
for curNode != nil {
fmt.Println("current node val: ", curNode.val)
curNode = curNode.next
}
}
func (dll *DoublyLinkedList) retrieveNode(val interface{}) (*Node, error) {
// linear
curNode := dll.headNode
for curNode != nil {
if curNode.val == val {
return curNode, nil
}
curNode = curNode.next
}
return nil, ErrNoNode
}
// pop the head node everytime
func (dll *DoublyLinkedList) deleteHead() *Node {
dll.capacity--
head := dll.headNode.next
dll.headNode.next = head.next
head.next.prev = dll.headNode
return head
}
// pop the tail node everytime
func (dll *DoublyLinkedList) deleteTail() *Node {
dll.capacity--
tail := dll.tailNode.prev
tail.prev.next = dll.tailNode
dll.tailNode.prev = tail.prev
return tail
}
// delete a specifc node
func (dll *DoublyLinkedList) deleteNode(node *Node) {
dll.capacity--
if node.prev.prev == nil {
// if head node
dll.deleteHead()
} else if node.next.next == nil {
// if tail node
dll.deleteTail()
} else {
prevNode := node.prev
prevNode.next = node.next
node.next.prev = node.prev
}
}