-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathproblem006.go
More file actions
68 lines (57 loc) · 1.5 KB
/
Copy pathproblem006.go
File metadata and controls
68 lines (57 loc) · 1.5 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
package problem006
import (
"errors"
"math/rand"
"time"
)
// Mocking pointer arithmetic
var mockMemory = make(map[NodePointer]*node)
type node struct {
address NodePointer
both NodePointer
}
func (node node) getPointer() NodePointer {
return node.address
}
type NodePointer uint
func (nodePointer NodePointer) dereferencePointer() *node {
return mockMemory[nodePointer]
}
func NewNode(both NodePointer) *node {
rand.Seed(time.Now().UnixNano())
node := node{
address: NodePointer(rand.Intn(1000000)) + 1,
both: both,
}
mockMemory[node.address] = &node
return &node
}
func Add(head *node) error {
if head == nil {
return errors.New("cannot dereference nil head")
}
prevNodePointer, atCursor := NodePointer(0), head
for atCursor.both != prevNodePointer {
prevNodePointer, atCursor = atCursor.getPointer(), (prevNodePointer ^ atCursor.both).dereferencePointer()
}
newLastNode := NewNode(atCursor.getPointer())
atCursor.both = prevNodePointer ^ newLastNode.getPointer()
return nil
}
type IndexOutOfRange struct{}
func (IndexOutOfRange) Error() string {
return "index out of range"
}
func Get(head *node, index int) (*node, error) {
if head == nil || index < 0 {
return nil, IndexOutOfRange{}
}
prevNodePointer, atCursor := NodePointer(0), head
for i := 0; i < index; i++ {
if atCursor.both == prevNodePointer {
return nil, IndexOutOfRange{}
}
prevNodePointer, atCursor = atCursor.getPointer(), (prevNodePointer ^ atCursor.both).dereferencePointer()
}
return atCursor, nil
}