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)
}