package llist import ( "fmt" ) type Node struct { Data any Next *Node } type LinkedList struct { Front *Node End *Node Count int } 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 } l.Count++ } func (l *LinkedList) Find(data any) (*Node) { for el := l.Front; el != nil; el = el.Next { if el.Data == data { return el } } return nil } func (l *LinkedList) Delete(target *Node) { if l.Front == target { l.PopFront() } else if l.End == target { l.PopBack() } else { el := l.Front for el.Next != target { el = el.Next } el.Next = el.Next.Next target.Next = nil l.Count-- } } func (l *LinkedList) PopBack() (*Node) { el := l.End if l.Front == nil { return nil } else if l.Front == l.End { l.Front = nil l.End = nil l.Count-- } else { new_end := l.Front for new_end.Next.Next != nil { new_end = new_end.Next } l.End = new_end l.End.Next = nil l.Count-- } return 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 l.Count-- } else { l.Front = l.Front.Next l.Count-- } return el } func (l *LinkedList) Dump() { fmt.Println("----------------", l.Count, "nodes") for cur := l.Front; cur != nil; cur = cur.Next { fmt.Println(cur.Data) } }