Skip to content

Linked List

package linked_list

import "fmt"

type Node struct {
    Value int
    Next  *Node
}

type LinkedList struct {
    Head *Node
}

func (ll *LinkedList) Print() {
    if ll.Head == nil {
        fmt.Println("[]")
        return
    }
    fmt.Printf("[")
    ll.IterateList(func(v int) {
        fmt.Printf(" %d ->", v)
    })
    fmt.Printf("]\n")
}

func (ll *LinkedList) AddToHead(value int) {
    newHead := Node{
        Value: value,
        Next:  nil,
    }
    if ll.Head != nil {
        newHead.Next = ll.Head
    }
    ll.Head = &newHead
}

func (ll *LinkedList) AddToEnd(value int) {
    var last = &Node{
        Value: value,
    }
    lastNode := ll.LastNode()
    if lastNode != nil {
        lastNode.Next = last
    } else {
        // List is empty
        ll.Head = last
    }
}

func (ll *LinkedList) IterateList(fn func(v int)) {
    for node := ll.Head; node != nil; node = node.Next {
        fn(node.Value)
    }
}

func (ll *LinkedList) LastNode() *Node {
    var lastNode *Node
    for node := ll.Head; node != nil; node = node.Next {
        if node.Next == nil {
            lastNode = node
        }
    }
    return lastNode
}
func (ll *LinkedList) Length() int {
    var count = 0
    ll.IterateList(func(v int) { count++ })
    return count
}

func (ll *LinkedList) NodeWithValue(value int) *Node {
    for node := ll.Head; node != nil; node = node.Next {
        if node.Value == value {
            return node
        }
    }
    return nil
}

func (ll *LinkedList) AddAfter(nodeProperty, value int) {
    node := ll.NodeWithValue(nodeProperty)

    newNode := &Node{
        Value: value,
        Next: node.Next,
    }
    node.Next = newNode
}