package main import "fmt" type LinkNode struct { Data interface{} //數據 Prev *LinkNode //上一個指針 Next *LinkNode //下一個指針 } //創建雙向鏈表 (數據集合) func (node *Lin... ...
package main import "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 = 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 }