package mainimport ( "fmt" "reflect")//通過結構體嵌套本結構體指標來實作鏈表//結構體可以嵌套本結構體指標, 但不能嵌套本結構體本身, 長度不能超過 1024type LinkNode struct { Data interface{} Next *LinkNode // right , 可以嵌套本結構體指標 //Next LinkNode // error, 不能嵌套本結構體本身}//創建鏈表 Create(資料)func (node *LinkNode) Create(Data ...interface{}) { //1,2 if node == nil { return } //頭節點 head := node for i := 0; i < len(Data); i++ { //創建一個新的節點 newNode := new(LinkNode) newNode.Data = https://www.cnblogs.com/lurenq/p/Data[i] newNode.Next = nil //將新節點作為當前節點的下一個節點 node.Next = newNode node = node.Next } node = head}//列印鏈表func (node *LinkNode) Print() { if node == nil { return } //列印資料 if node.Data != nil { fmt.Println(node.Data," ") } //使用遞回遍歷下一個資料 node.Next.Print()}//鏈表長度func (node *LinkNode) Length() int { if node == nil { return -1 } i := 0 //一次查找下一個節點是否為nil for node.Next != nil { i++ node = node.Next } return i}//插入資料(頭插)func (node *LinkNode) InsertByHead(Data interface{}) { if node == nil { return } if Data =https://www.cnblogs.com/lurenq/p/= nil { return } //head:=node //創建新節點 newNode := new(LinkNode) //新節點賦值 newNode.Data = Data newNode.Next = node.Next //將新節點放在當前節點后面 node.Next = newNode}//插入資料(尾插)func (node *LinkNode) InsertByTail(Data interface{}) { if node == nil { return } //查找鏈表的末尾位置 for node.Next != nil { node = node.Next } //創建新節點 賦值 newNode := new(LinkNode) newNode.Data = Data newNode.Next = nil //將新節點放在鏈表末尾 node.Next = newNode}//插入資料(下標)位置func (node *LinkNode) InserrByIndex(index int, Data interface{}) { if node == nil { return } if index < 0 { return } /* if node.Length() < index{ 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 //上一個節點鏈接當前節點 preNode.Next = newNode}//洗掉資料(下標)位置func (node *LinkNode) DeleteByIndex(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 } //將上一個指標域結點指向node的下一個節點 preNode.Next = node.Next //銷毀當前節點 node.Data = nil node.Next = nil node = nil}//洗掉資料(資料)func (node *LinkNode) DeleteByData(Data interface{}) { if node == nil { return } if Data == nil { return } preNode := node for node.Next != nil { preNode = node node = node.Next //判斷interface存盤的資料型別是否相同 //reflect.DeepEqual() if reflect.TypeOf(node.Data) == reflect.TypeOf(Data) && node.Data == Data { preNode.Next = node.Next //銷毀資料 node.Data = nil node.Next = nil node = nil //如果添加return 表示洗掉第一個相同的資料 //如果不添加return 表示洗掉所有相同的資料 return } }}//查找資料 (資料)func (node *LinkNode) Search(Data interface{}) int { if node == nil { return -1 } if Data == nil { return -1 } i := 0 for node.Next != nil { i++ //比較兩個介面中的內容是否相同 //reflect.DeepEqual() if reflect.TypeOf(node.Data) == reflect.TypeOf(Data) && node.Data == Data { return i - 1 } node = node.Next } return -1}//銷毀鏈表func (node *LinkNode) Destroy() { if node == nil { return } //通過遞回毀銷毀鏈表 node.Next.Destroy() node.Data = nil node.Next = nil node = nil}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/53031.html
標籤:Go
上一篇:slice 實作原理
下一篇:雙向鏈表實作原理
