Skip to content

Instantly share code, notes, and snippets.

@genert
Created February 14, 2023 20:04
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save genert/a7ca6f0ea1f4fee708242763b72bfd5d to your computer and use it in GitHub Desktop.
Save genert/a7ca6f0ea1f4fee708242763b72bfd5d to your computer and use it in GitHub Desktop.
Linked Lists in Golang
package main
import "fmt"
type Node struct {
Value any
Next *Node
Prev *Node
}
type linkedList struct {
head *Node
tail *Node
size int
}
func (ll *linkedList) Append(value any) {
n := Node{value, nil, nil}
if ll.head == nil {
ll.head = &n
ll.tail = &n
ll.size++
return
}
n.Prev = ll.tail
ll.tail.Next = &n
ll.tail = &n
ll.size++
}
func (ll *linkedList) Prepend(value any) {
n := Node{value, nil, nil}
if ll.head == nil {
ll.head = &n
ll.tail = &n
ll.size++
return
}
n.Next = ll.head
ll.head.Prev = &n
ll.head = &n
ll.size++
}
func (ll *linkedList) InsertAt(value any, pos int) {
if pos < 0 || pos > ll.size {
return
}
if pos == 0 {
ll.Prepend(value)
return
}
var currNode, prevNode *Node
var i int
currNode = ll.head
for i < pos {
prevNode = currNode
currNode = currNode.Next
i++
}
n := Node{value, currNode, prevNode}
currNode.Prev = &n
prevNode.Next = &n
ll.size++
}
func (ll *linkedList) DeleteAt(pos int) {
if pos < 0 || pos > ll.size {
return
}
if pos == 0 {
ll.head = ll.head.Next
ll.head.Prev = nil
ll.size--
return
}
var currNode, prevNode *Node
var i int
currNode = ll.head
for i < pos {
prevNode = currNode
currNode = currNode.Next
i++
}
prevNode.Next = currNode.Next
currNode.Prev = prevNode
ll.size--
}
func (ll *linkedList) Print() {
n := ll.head
var i int
for n.Next != nil {
fmt.Println(n.Value, " at ", i)
n = n.Next
i++
}
fmt.Println(n.Value, " at ", i)
}
func main() {
l := linkedList{}
l.Append("test")
l.Append("hello")
l.Prepend("yolo")
l.InsertAt("t", 0)
l.InsertAt("b", 1)
l.DeleteAt(0)
l.DeleteAt(1)
l.Print()
}
package main
import "fmt"
type Node struct {
Value any
Next *Node
}
type linkedList struct {
head *Node
size int
}
func (ll *linkedList) Append(value any) {
n := Node{value, nil}
if ll.head == nil {
ll.head = &n
ll.size++
return
}
h := ll.head
for h.Next != nil {
h = h.Next
}
h.Next = &n
ll.size++
}
func (ll *linkedList) Prepend(value any) {
n := Node{value, nil}
if ll.head == nil {
ll.head = &n
ll.size++
return
}
n.Next = ll.head
ll.head = &n
ll.size++
}
func (ll *linkedList) InsertAt(value any, pos int) {
if pos < 0 || pos > ll.size {
return
}
if pos == 0 {
ll.Prepend(value)
return
}
var currNode, prevNode *Node
var i int
currNode = ll.head
for i < pos {
prevNode = currNode
currNode = currNode.Next
i++
}
n := Node{value, currNode}
prevNode.Next = &n
ll.size++
}
func (ll *linkedList) DeleteAt(pos int) {
if pos < 0 || pos > ll.size {
return
}
if pos == 0 {
ll.head = ll.head.Next
ll.size--
return
}
var currNode, prevNode *Node
var i int
currNode = ll.head
for i < pos {
prevNode = currNode
currNode = currNode.Next
i++
}
prevNode.Next = currNode.Next
ll.size--
}
func (ll *linkedList) Print() {
n := ll.head
var i int
for n.Next != nil {
fmt.Println(n.Value, " at ", i)
n = n.Next
i++
}
fmt.Println(n.Value, " at ", i)
}
func main() {
l := linkedList{}
l.Append("test")
l.Append("hello")
l.Prepend("yolo")
l.InsertAt("t", 0)
l.InsertAt("b", 1)
l.DeleteAt(0)
l.DeleteAt(1)
l.Print()
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment