雙向鏈表node
主要有鏈表跟節點2個結構體bash
type Dnode struct { data interface{} prev *Dnode next *Dnode } type DList struct { head *Dnode tail *Dnode size int }
特色:app
一、除頭部、尾部2個節點外,其餘任意節點都經過prev / next 分別指向前置後置節點ide
二、頭部節點前置節點爲空,同理尾部節點後置節點爲空blog
主要實現的API以下:索引
一、查詢rem
查詢鏈表長度get
查詢任意節點it
二、添加class
從開頭插入節點
從尾部插入節點
從任意位置插入節點
三、刪除
刪除任意節點
四、其餘
打印鏈表
初始化鏈表
具體實現以下:
package main import "fmt" type Dnode struct { data interface{} prev *Dnode next *Dnode } type DList struct { head *Dnode tail *Dnode size int } // 獲取鏈表長度 func (dl *DList)getSize()int{ return dl.size } // 獲取鏈表頭部 func (dl *DList)getHead() *Dnode{ return dl.head } // 獲取鏈表尾部 func (dl *DList)getTail() *Dnode{ return dl.tail } // 初始化鏈表 func initDList()(dl *DList){ return &DList{ head:nil, tail:nil, size:0, } } // 打印鏈表 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 } } // 在頭部追加節點 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 } // 在尾部追加節點 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 } // 增長任意節點 func (dl *DList) insert(node *Dnode,index int){ if dl.getSize() == 0 { dl.addHeadNode(node) } // 獲取當前索引爲index 值的節點 oldNode := dl.getNode(index) node.next = oldNode node.prev = oldNode.prev oldNode.prev.next = node oldNode.prev = node dl.size ++ } // 查詢節點 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 } // 任意節點刪除 func (dl *DList) remove(node *Dnode) { // 默認刪除尾部節點 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("從開頭添加節點") for i:=0;i<5;i++{ dnode := Dnode{ data:i, } dl.addHeadNode(&dnode) } dl.display() fmt.Println("從末尾添加節點") for i:=5;i<10;i++{ dnode := Dnode{ data:i, } dl.append(&dnode) } dl.display() fmt.Println("刪除最後一個節點") dl.remove(nil) dl.display() fmt.Println("刪除第3個節點") node := dl.getNode(3) dl.remove(node) dl.display() fmt.Println("添加第2個節點") node = &Dnode{ data:3, } dl.insert(node,1) dl.display() }