Doubly linked list
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-
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() }