Start Typing !!! type the highlighted character. You can't scroll once you start typing.
filename

double-linkedlist.go

// demonstration of doubly linked list in golang

package doublelinkedlist

// package main

import "fmt"

type node struct {

val int

next *node

prev *node

}

type doublelinkedlist struct {

head *node

}

// to avoid mistakes when using pointer vs struct for new node creation

func newNode(val int) *node {

n := &node{}

n.val = val

n.next = nil

n.prev = nil

return n

}

func (ll *doublelinkedlist) addAtBeg(val int) {

n := newNode(val)

n.next = ll.head

ll.head = n

}

func (ll *doublelinkedlist) addAtEnd(val int) {

n := newNode(val)

if ll.head == nil {

ll.head = n

return

}

cur := ll.head

for ; cur.next != nil; cur = cur.next {

}

cur.next = n

n.prev = cur

}

func (ll *doublelinkedlist) delAtBeg() int {

if ll.head == nil {

return -1

}

cur := ll.head

ll.head = cur.next

if ll.head != nil {

ll.head.prev = nil

}

return cur.val

}

func (ll *doublelinkedlist) delAtEnd() int {

// no item

if ll.head == nil {

return -1

}

// only one item

if ll.head.next == nil {

return ll.delAtBeg()

}

// more than one, go to second last

cur := ll.head

for ; cur.next.next != nil; cur = cur.next {

}

retval := cur.next.val

cur.next = nil

return retval

}

func (ll *doublelinkedlist) count() int {

var ctr int = 0

for cur := ll.head; cur != nil; cur = cur.next {

ctr += 1

}

return ctr

}

func (ll *doublelinkedlist) reverse() {

var prev, next *node

cur := ll.head

for cur != nil {

next = cur.next

cur.next = prev

cur.prev = next

prev = cur

cur = next

}

ll.head = prev

}

func (ll *doublelinkedlist) display() {

for cur := ll.head; cur != nil; cur = cur.next {

fmt.Print(cur.val, " ")

}

fmt.Print("\n")

}

func (ll *doublelinkedlist) displayReverse() {

if ll.head == nil {

return

}

var cur *node

for cur = ll.head; cur.next != nil; cur = cur.next {

}

for ; cur != nil; cur = cur.prev {

fmt.Print(cur.val, " ")

}

fmt.Print("\n")

}

/*

func main() {

ll := doublelinkedlist{}

ll.addAtBeg(10)

ll.addAtEnd(20)

ll.display()

ll.addAtBeg(30)

ll.display()

ll.reverse()

ll.display()

ll.displayReverse()

fmt.Print(ll.delAtBeg(), "\n")

fmt.Print(ll.delAtEnd(), "\n")

fmt.Print("Display")

ll.display()

fmt.Print(ll.delAtBeg(), "\n")

ll.display()

fmt.Print(ll.delAtBeg(), "\n")

ll.display()

}

*/