Source File: ex21/main.go

package main

import (
    "fmt"
)

type Node struct {
    Data any
    Next *Node
}

type LinkedList struct {
    Front *Node
    End *Node
}

func (l *LinkedList) Add(data any) {
    el := Node{data, nil}

    if l.Front == nil {
        l.Front = &el
        l.End = &el
    } else {
        l.End.Next = &el
        l.End = &el
    }
}

func (l *LinkedList) PopFront() (*Node) {
    el := l.Front

    if l.Front == nil {
        return nil
    } else if l.Front == l.End {
        l.Front = nil
        l.End = nil
    } else {
        l.Front = l.Front.Next
    }

    return el
}

func (l *LinkedList) Dump() {
    fmt.Println("----------------")

    for cur := l.Front; cur != nil; cur = cur.Next {
        fmt.Println(cur.Data)
    }
}

func main() {
    list := new(LinkedList)
    list.Add("hello")
    list.Add("world")

    fmt.Println("Front is", list.Front.Data)
    fmt.Println("End is", list.End.Data)

    front := list.PopFront()
    fmt.Println("Popped front is", front.Data)

    fmt.Println("New front is", list.Front.Data)
    fmt.Println("New end is", list.End.Data)

    end := list.PopFront()
    fmt.Println("Popped end/front is", end.Data)

    fmt.Println("Now Front is", list.Front, "and End is", list.End)
}