Skip to content

Instantly share code, notes, and snippets.

@miry
Created January 16, 2018 10:08
Show Gist options
  • Save miry/73425f9420d2c8dee9eeab31fac02902 to your computer and use it in GitHub Desktop.
Save miry/73425f9420d2c8dee9eeab31fac02902 to your computer and use it in GitHub Desktop.
List created by miry - https://repl.it/@miry/List
package main
import "fmt"
import "errors"
type Node struct {
next *Node
value string
}
func (n *Node) Append(next *Node) {
last := n
for node := n; node != nil; node = node.next {
last = node
}
last.next = next
}
func (n *Node) Delete(pos int) (*Node, error) {
if pos == 0 {
result := n.next
n.next = nil
return result, nil
}
node, err := n.Get(pos-1)
if err != nil {
return n, err
}
subject := node.next
next := subject.next
node.next = next
subject.next = nil
return n, err
}
func (n *Node) Get(pos int) (*Node, error) {
if pos < 0 {
return nil, errors.New("Out of index")
}
node := n
for i := 0; i < pos; i++ {
if node.next == nil {
return nil, errors.New("Out of index")
}
node = node.next
}
return node, nil
}
func (n *Node) Insert(pos int, next *Node) (*Node, error) {
if pos == 0 {
next.next = n
return next, nil
}
node, err := n.Get(pos-1)
if err != nil {
return n, err
}
old := node.next
next.next = old
node.next = next
return n, err
}
func (n *Node) Print() {
for node := n; node != nil; node = node.next {
fmt.Println(node.value)
}
}
func main() {
fmt.Println("## Example of the List implementation")
first := &Node{value: "First node"}
first.Print()
fmt.Println()
fmt.Println("### Append element")
second := &Node{value: "Second node"}
third := &Node{value: "Third node"}
first.next = second
first.Append(third)
first.Print()
fmt.Println()
fmt.Println("### Get element")
second, _ = first.Get(1)
fmt.Println("Get second node:", second.value)
third, _ = first.Get(2)
fmt.Println("Get third node: ", third.value)
_, err := first.Get(3)
if err != nil {
fmt.Println("ERROR: ", err)
} else {
panic("Should not come here")
}
fmt.Println()
fmt.Println("### Insert element")
newSecond := &Node{value: "New Second"}
first.Insert(1, newSecond)
oops := &Node{value: "Should not be in the list"}
first, err = first.Insert(6, oops)
if err != nil {
fmt.Println("ERROR: ", err)
} else {
panic("Should not come here")
}
newFirst := &Node{value: "New First"}
first, _ = first.Insert(0, newFirst)
first.Print()
fmt.Println()
fmt.Println("### Delete element")
first, _ = first.Delete(0)
first, _ = first.Delete(3)
first.Print()
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment