go實現循環鏈表

                                  時間平復了一時的衝動,卻加深了挫敗感。
                                                                               ——馬爾克斯  《百年孤獨》

 

上代碼

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

雙鏈表的實現可移步:雙向鏈表實現

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章