時間平復了一時的衝動,卻加深了挫敗感。
——馬爾克斯 《百年孤獨》
上代碼
package main
import "fmt"
/*
這次先基於單鏈表實現循環鏈表,雙向的下次補上。
循環鏈表:循環鏈表的所有節點形成一個環。單鏈表的尾節點指向首節點形成單向循環鏈表
*/
type DanNode struct {
Data int
Next *DanNode
}
type DanList struct {
First *DanNode
Last *DanNode
Size int
}
// 創建一個空的單鏈表
func CreateNewDanAirList() (list *DanList) {
return &DanList{}
}
// 給鏈表末尾新增一個節點
func (list *DanList) AddOneNodeToDan(value int) {
newNode := new(DanNode)
newNode.Data = value
// 鏈表爲空時
if list.Size < 1 {
list.First = newNode
list.Last = newNode
newNode.Next = nil
} else {
// 鏈表的長度>=1時
lastNode := list.Last
lastNode.Next = newNode
newNode.Next = list.First
list.Last = newNode
}
list.Size += 1
}
// 刪除鏈表末尾節點
func (list *DanList) RemoveOneNode() {
// 鏈表爲空時
if list.Size < 1 {
return
}
// 鏈表的長度>=1時
lastCount := list.Size
last2Count := list.Size - 1
if lastCount == 1 {
list.First = nil
list.Last = nil
return
}
var last2Node *DanNode
currentNode := list.First
for i := 1; i <= lastCount; i++ {
if i >= 2 {
currentNode = currentNode.Next
if i == last2Count {
last2Node = currentNode
}
}
}
last2Node.Next = list.First
list.Last = last2Node
list.Size -= 1
}
// 刪除鏈表首節點
func (list *DanList) RemoveOneNodeFront() {
if list.Size < 1 {
return
}
firstNode := list.First
list.First = firstNode.Next
list.Last.Next = list.First
list.Size -= 1
}
// 給鏈表開始新增一個節點
func (list *DanList) AddOneNodeToDan2Front(value int) {
newNode := new(DanNode)
newNode.Data = value
// 鏈表爲空時
if list.Size < 1 {
list.First = newNode
list.Last = newNode
} else {
// 鏈表的長度>=1時
firstNode := list.First
newNode.Next = firstNode
list.First = newNode
list.Last.Next = newNode
}
list.Size += 1
}
// 打印鏈表
func (list *DanList) PrintDan() {
if list.Size == 0 {
return
}
currentNode := &DanNode{}
for i := 0; i < list.Size; i++ {
if i == 0 {
currentNode = list.First
}
if currentNode.Next == list.First {
fmt.Print(currentNode.Data, "\t")
return
}
fmt.Print(currentNode.Data, "\t")
currentNode = currentNode.Next
}
}
func main() {
list := CreateNewDanAirList()
fmt.Println("新增元素:")
list.AddOneNodeToDan(17)
list.AddOneNodeToDan(18)
list.AddOneNodeToDan(19)
list.PrintDan() // 17 18 19
fmt.Println("尾結點", list.Last.Data, "的下一個節點是:", list.Last.Next.Data) //17 18 19 尾結點 19 的下一個節點是: 17
list.AddOneNodeToDan2Front(16) // 給開頭新增元素,值爲16
fmt.Println("給開頭新增一個元素16作爲首節點:")
list.PrintDan() // 16 17 18 19
list.RemoveOneNode() // 刪除尾節點
fmt.Println("\n刪除尾節點")
list.PrintDan() // 16 17 18
fmt.Println("\n刪除首節點:")
list.RemoveOneNodeFront()
list.PrintDan() // 17 18
}
控制檯:
新增元素:
17 18 19 尾結點 19 的下一個節點是: 17
給開頭新增一個元素作爲首節點:
16 17 18 19
刪除尾節點
16 17 18
刪除首節點:
17 18
Process finished with exit code 0
雙鏈表的實現可移步:雙向鏈表實現