Skip to content

Instantly share code, notes, and snippets.

@em-deltaxp
Last active September 26, 2024 11:01
Show Gist options
  • Save em-deltaxp/a656a89ee14a4c3d9991d5c4cb0d01d1 to your computer and use it in GitHub Desktop.
Save em-deltaxp/a656a89ee14a4c3d9991d5c4cb0d01d1 to your computer and use it in GitHub Desktop.
package main
import "fmt"
type ComparableStringer interface {
comparable
fmt.Stringer
}
type IntComparableStringer int
func (i IntComparableStringer) String() string {
return fmt.Sprintf("%d", i)
}
type Node[T ComparableStringer] struct {
val T
next *Node[T]
}
func (n *Node[T]) Add(val T) *Node[T] {
if n == nil {
return &Node[T]{
val: val,
next: nil,
}
}
newNode := &Node[T]{
val: val,
next: n.next,
}
n.next = newNode
return newNode
}
type LinkedList[T ComparableStringer] struct {
first, last *Node[T]
}
func NewLinkedList[T ComparableStringer]() *LinkedList[T] {
return &LinkedList[T]{
first: nil,
last: nil,
}
}
func (l *LinkedList[T]) Add(val T) {
l.last = l.last.Add(val)
if l.first == nil {
l.first = l.last
}
}
func (l *LinkedList[T]) Insert(val T, index int) {
if l.first == nil {
l.Add(val)
} else {
n := l.first
var p *Node[T]
for i := 0; i < index; i++ {
if n != nil {
p = n
n = n.next
}
}
var tmp *Node[T]
tmp = tmp.Add(val)
tmp.next = n
if p != nil {
if p.next == nil {
l.last = tmp
}
p.next = tmp
} else {
l.first = tmp
}
}
}
func (l *LinkedList[T]) Index(val T) int {
i := 0
for n := l.first; n != nil; n = n.next {
if n.val == val {
return i
}
i += 1
}
return -1
}
func (l *LinkedList[T]) Print() {
fmt.Print("( ")
defer fmt.Print(")\n\n")
if l.first == nil {
fmt.Print("Empty list!")
}
i := 0
for n := l.first; n != nil; n = n.next {
fmt.Printf("[%d: %s] ", i, n.val)
i += 1
}
}
func main() {
l := NewLinkedList[IntComparableStringer]()
l.Print()
l.Add(39)
l.Print()
l.Add(84)
l.Add(92)
l.Print()
l.Insert(1023, 0)
l.Print()
var val IntComparableStringer = 84
fmt.Printf("\n%d found at index %d\n\n", val, l.Index(val))
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment