-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathlinkedList.go
More file actions
109 lines (97 loc) · 2.07 KB
/
linkedList.go
File metadata and controls
109 lines (97 loc) · 2.07 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
package linkedList
import "errors"
/* value is the value of node; next is the pointer to next node */
type linkedListNode struct {
_value int
Next *linkedListNode
}
type Linkedlist struct {
Head *linkedListNode
}
func NewLinkedlist(head *linkedListNode) *Linkedlist {
return &Linkedlist{Head: head}
}
func (l *Linkedlist) Append(val int) {
newNode := linkedListNode{_value: val, Next: nil}
if l.Head == nil {
l.Head = &newNode
} else {
current := l.Head
for current.Next != nil {
current = current.Next
}
current.Next = &newNode
}
}
func (l *Linkedlist) InsertAtFront(val int) error{
return l.InsertAt(0, val)
}
func (l *Linkedlist) InsertAt(index, val int) error {
newNode := linkedListNode{_value: val, Next: nil}
if index == 0 {
newNode.Next = l.Head
l.Head = &newNode
} else {
node, err := l.getNodeByIndex(index-1)
if err != nil {
return err
}
next := node.Next
node.Next = &newNode
newNode.Next = next
}
return nil
}
func (l *Linkedlist) DeleteAt(index int) error {
if index == 0 && l.Head != nil{
temp := l.Head.Next
l.Head.Next = nil
l.Head = temp
} else {
node, err := l.getNodeByIndex(index-1)
if err != nil {
return err
}
next := node.Next
if next != nil {
node.Next = next.Next
next.Next = nil
} else {
return errors.New("list is too small.")
}
}
return nil
}
func (l *Linkedlist) PopFrontValue() (int, error) {
if l.Head == nil {
return -1, errors.New("LinkedList is empty.")
} else {
temp := l.Head
l.Head = l.Head.Next
return temp._value, nil
}
}
func (l *Linkedlist) PopBackValue() (int, error) {
if l.Head == nil {
return -1, errors.New("LinkedList is empty.")
} else {
current := l.Head
for current.Next.Next != nil {
current = current.Next
}
current.Next = nil
return current._value, nil
}
}
func (l *Linkedlist) getNodeByIndex(index int) (*linkedListNode, error) {
current := l.Head
next := current.Next
for i := 0; i < index; i++ {
current = next
if current == nil {
return nil, errors.New("list is too small.")
}
next = next.Next
}
return current, nil
}