package mainimport "fmt"type LinkNode struct { Data interface{} 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 //當前節點的下一個節點為新節點 node.Next = newNode node = node.Next } //形成倍訓 //最后一個節點的下一個節點 為第一個節點 node.Next = head.Next node = head}//列印回圈鏈表func (node *LinkNode) Print() { if node == nil { return } //記錄回圈鏈表的起始點 start := node.Next //列印鏈表 for { node = node.Next if node.Data != nil { fmt.Print(node.Data," ") } if start == node.Next { break } } // 單向鏈表列印方式 //for node.Next != nil { // if node.Data != nil { // fmt.Println(node.Data) // } // node = node.Next //}}//回圈鏈表長度 回傳值 個數func (node *LinkNode) Length() int { if node == nil { return -1 } //記錄回圈鏈表的起始點 start := node.Next //定義計數器 i := 0 for { node = node.Next i++ if start == node.Next { break } } return i}//插入資料(下標 資料)func (node *LinkNode) Insert(index int, Data interface{}) { if node == nil { return } //判斷位置是否越界 if index < 0 || node.Length()+1 < index { return } if Data =https://www.cnblogs.com/lurenq/p/= nil { return } fmt.Println(node) //記錄鏈表第一個節點 start := node.Next //記錄上一個節點 preNode := node for i := 0; i < index; i++ { preNode = node node = node.Next } //創建新節點 newNode := new(LinkNode) newNode.Data = Data //新節點的下一個節點為node newNode.Next = node //上一個節點的下一個節點為新節點 preNode.Next = newNode //判斷如果是第一個節點需要將最后一個節點指向新節點 if index == 1 { for { //判斷最后一個節點 if start == node.Next { break } node = node.Next } //新節點為最后一個節點的下一個節點 node.Next = newNode }}//洗掉資料 (下標)func (node *LinkNode) Delete(index int) { if node == nil { return } if index < 0{ return } //起始節點 start := node.Next //記錄上一個節點 preNode := node //回圈找到洗掉資料的位置 for i := 0; i < index; i++ { preNode = node node = node.Next } //判斷如果洗掉的是第一個節點 if index == 1 { //temp記錄最后一個位置 temp := start for { if start == temp.Next { break } temp = temp.Next } //將最后一個節點指向新節點 temp.Next = node.Next } //洗掉資料 preNode.Next = node.Next //資料銷毀 //node.Data = nil //node.Next = nil node = nil}
//約瑟夫環
//運用 -- 海盜分金func main() { list := new(LinkNode) list.Create(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32) fmt.Println("原始資料:") list.Print() fmt.Println() fmt.Println("洗掉資料:") i := 1 for list.Length() > 2 { i += 3 if i > list.Length() { i = list.Length()%3 + 1 } list.Delete(i) list.Print() fmt.Println() }}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/53033.html
標籤:Go
上一篇:雙向鏈表實作原理
下一篇:go 語言實作堆疊原理
