package mainimport "fmt"type LinkNode struct { Data interface{} //資料 Prev *LinkNode //上一個指標 Next *LinkNode //下一個指標}//創建雙向鏈表 (資料集合)func (node *LinkNode) Create(Data ...interface{}) { if node == nil { return } if len(Data) == 0 { return } //記錄頭節點 head := node for _, v := range Data { //創建新節點 newNode := new(LinkNode) newNode.Data = https://www.cnblogs.com/lurenq/p/v //新節點指向上一個節點 newNode.Prev = node //當前節點的下一個節點是新節點 node.Next = newNode //當前節點為下一個節點 node = node.Next } //頭節點的上一個節點Prev 可以指向最后一個節點 //head.Prev=node node = head}//列印雙向鏈表func (node *LinkNode) Print() { if node == nil { return } //正序列印資料 for node != nil { if node.Data != nil { fmt.Println(node.Data) } node = node.Next }}//列印雙向鏈表 倒序func (node *LinkNode) Print02() { if node == nil { return } //指向鏈表末尾 for node.Next != nil { node = node.Next } //從后向前列印資料 for node.Prev != nil { if node.Data != nil { fmt.Println(node.Data) } node = node.Prev }}//資料長度 回傳值 個數func (node *LinkNode) Length() int { if node == nil { return -1 } i := 0 for node.Next != nil { i++ node = node.Next } return i}//插入資料 (下標 資料)func (node *LinkNode) Index(index int, Data interface{}) { if node == nil { return } if index < 0 { return } if Data == nil { return } //記錄上一個節點 preNode := node //回圈找到插入的節點 for i := 0; i < index; i++ { preNode = node if node == nil { return } node = node.Next } //創建新節點 newNode := new(LinkNode) newNode.Data = Data //將新節點的指標域分別指向上一個節點和下一個節點 newNode.Next = node newNode.Prev = preNode //上一個節點的下一個節點為新節點 preNode.Next = newNode //下一個節點的上一個節點為新節點 node.Prev = newNode}//洗掉資料 (下標)func (node *LinkNode) Delete(index int) { if node == nil { return } if index < 0 { return } //記錄上一個節點 preNode := node for i := 0; i < index; i++ { preNode = node if node == nil { return } node = node.Next } //洗掉節點 // 把上一個節點的 Next 變為當前節點的下一個節點 preNode.Next = node.Next //將當前節點的下一個節點的上一個節點變為上一個節點 //當前節點的下一個節點的上一個節點為上一個節點 node.Next.Prev = preNode //銷毀當前節點 node.Data = nil node.Next = nil node.Prev = nil node = nil}//鏈表銷毀func (node *LinkNode) Destroy() { if node == nil { return } node.Next.Destroy() node.Data = nil node.Next = nil node.Prev = nil node = nil}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/53032.html
標籤:Go
上一篇:單向鏈表實作原理
