Created
January 16, 2018 10:08
-
-
Save miry/73425f9420d2c8dee9eeab31fac02902 to your computer and use it in GitHub Desktop.
List created by miry - https://repl.it/@miry/List
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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