-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdoubleLinkedList.go
140 lines (114 loc) · 2.79 KB
/
doubleLinkedList.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
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
package common
import "log"
type DoubleLinkedListNode struct {
value interface{}
next *DoubleLinkedListNode
previous *DoubleLinkedListNode
list *DoubleLinkedList
}
func (thisNode *DoubleLinkedListNode) Next() *DoubleLinkedListNode {
return thisNode.next
}
func (thisNode *DoubleLinkedListNode) Previous() *DoubleLinkedListNode {
return thisNode.previous
}
func (thisNode *DoubleLinkedListNode) Value() interface{} {
return thisNode.value
}
type DoubleLinkedList struct {
length int
head *DoubleLinkedListNode
tail *DoubleLinkedListNode
}
func (list *DoubleLinkedList) Length() int {
return list.length
}
func (thisList *DoubleLinkedList) Head() *DoubleLinkedListNode {
return thisList.head
}
func (thisList *DoubleLinkedList) Tail() *DoubleLinkedListNode {
return thisList.tail
}
func (thisList *DoubleLinkedList) Append(value interface{}) {
node := &DoubleLinkedListNode{
value: value,
list: thisList,
}
if thisList.head == nil {
thisList.head = node
thisList.tail = node
} else {
node.previous = thisList.tail
thisList.tail.next = node
thisList.tail = node
}
thisList.length++
}
func (thisList *DoubleLinkedList) Prepend(value interface{}) {
newNode := &DoubleLinkedListNode{
value: value,
list: thisList,
}
if thisList.head == nil {
thisList.head = newNode
thisList.tail = newNode
} else {
newNode.next = thisList.head
thisList.head.previous = newNode
thisList.head = newNode
}
thisList.length++
}
func (thisList *DoubleLinkedList) InsertAfter(value interface{}, thisNode *DoubleLinkedListNode) {
nextNode := thisNode.next
newNode := &DoubleLinkedListNode{
value: value,
next: nextNode,
previous: thisNode,
list: thisList,
}
thisNode.next = newNode
nextNode.previous = newNode
if newNode.next == nil {
thisList.tail = newNode
}
thisList.length++
}
func (thisList *DoubleLinkedList) InsertBefore(value interface{}, thisNode *DoubleLinkedListNode) {
previousNode := thisNode.previous
newNode := &DoubleLinkedListNode{
value: value,
next: thisNode,
previous: previousNode,
list: thisList,
}
thisNode.previous = newNode
previousNode.next = newNode
if newNode.previous == nil {
thisList.head = newNode
}
thisList.length++
}
func (thisList *DoubleLinkedList) Remove(thisNode *DoubleLinkedListNode) {
if thisNode.list != thisList {
log.Panic("The specified DoubleLinkedListNode is not an element of this DoubleLinkedList.")
}
if thisNode.previous == nil {
thisList.head = thisNode.next
} else {
thisNode.previous.next = thisNode.next
}
if thisNode.next == nil {
thisList.tail = thisNode.previous
} else {
thisNode.next.previous = thisNode.previous
}
thisList.length--
}
func NewDoubleLinkedList() *DoubleLinkedList {
return &DoubleLinkedList{
length: 0,
head: nil,
tail: nil,
}
}