Golang yourself with a two-way linked list

Doubly linked list

image.png


There are two lists with node structure

type Dnode struct {
   data interface{}
   prev *Dnode
   next *Dnode
}

type  DList struct {
   head *Dnode
   tail *Dnode
   size int
}




Features:

1, except for the head and tail nodes 2, through any other nodes prev / next node point to pre- and post-

image.png

2, the pre-head node is the node empty, the node Similarly the tail node is empty post



The main API implemented as follows:

1, the query

Query list length

Query any node



2, add

Insert Node from the beginning

Node is inserted from the rear

Node is inserted from an arbitrary position


3, delete

Delete any node


4. Other

Print the list

Initialization list


Specific achieve the following:

package main

import "fmt"

type Dnode struct {
   data interface{}
   prev *Dnode
   next *Dnode
}

type  DList struct {
   head *Dnode
   tail *Dnode
   size int
}

// Get the list length
func (dl *DList)getSize()int{
   return dl.size
}

// Get the list head
func (dl *DList)getHead() *Dnode{
   return dl.head
}

// Get the list tail
func (dl *DList)getTail() *Dnode{
   return dl.tail
}

// initialization list
initDList function () (dl * DList) {
   return &DList{
      head:nil,
      tail:nil,
      size:0,
   }
}

// Print the list
func (dl *DList) display(){
   fmt.Println("DoubleLinkedList size is ",dl.size)
   if dl.getSize() == 0{
      return
   }
   ptr := dl.head
   for ptr != nil{
      fmt.Println("data is ",ptr.data)
      ptr = ptr.next
   }
}

// additional nodes in the head
func (dl *DList) addHeadNode(node *Dnode){
   if dl.getSize() == 0{
      dl.head = node
      dl.tail = node
      node.prev = nil
      node.next = nil
   }else{
      dl.head.prev = node
      node.prev = nil
      node.next = dl.head
      dl.head = node
   }
   dl.size += 1
}

// additional node in the tail
func (dl *DList) append(node *Dnode){
   if dl.getSize() == 0 {
      dl.head = node
      dl.tail = node
      node.prev = nil
      node.next = nil
   }else{
      dl.tail.next = node
      node.prev = dl.tail
      node.next = nil
      dl.tail = node
   }
   dl.size += 1
}

// add any node
func (dl *DList) insert(node *Dnode,index int){
   if dl.getSize() == 0 {
      dl.addHeadNode(node)
   }
   // Get the current value of the index for the index node
   oldNode := dl.getNode(index)
   node.next = oldNode
   node.prev = oldNode.prev
   oldNode.prev.next = node
   oldNode.prev = node
   
   dl.size ++
}

// query node
func (dl *DList) getNode(index int)(dnode *Dnode){
   if dl.getSize() == 0 || index > dl.getSize() {
      return nil
   }
   if index == 0{
      return dl.head
   }
   node := dl.head
   for i:=0;i<=index;i++{
      dnode = node.next
   }
   return
}


// delete any node
func (dl *DList) remove(node *Dnode) {
   // delete the default node tail
   if node == nil || node == dl.tail{
      node = dl.tail
      dl.tail = node.prev
      dl.tail.next = nil
   }else if node == dl.head{
      dl.head = node.next
      dl.head.prev = nil
   }else{
      node.prev.next = node.next
      node.next.prev = node.prev
   }

   dl.size --
}

func main() {
   dl := initDList()
   fmt.Println ( "add nodes from the beginning")
   for i:=0;i<5;i++{
      dnode: = {Dnode
         data:i,
      }
      dl.addHeadNode(&dnode)
   }
   dl.display()

   fmt.Println ( "add nodes from the end")
   for i:=5;i<10;i++{
      dnode: = {Dnode
         data:i,
      }
      dl.append(&dnode)
   }
   dl.display()

   fmt.Println ( "remove the last node")

   dl.remove(nil)
   dl.display()

   fmt.Println ( "delete the first three node")
   node := dl.getNode(3)
   dl.remove(node)
   dl.display()


   fmt.Println ( "add a second node")
   node = &Dnode{
      data:3,
   }
   dl.insert(node,1)
   dl.display()
}


Guess you like

Origin blog.51cto.com/pmghong/2458747