go實現單鏈表

          每當我看着大海的時候,我總想找人談談。但當我和人交談時,我又總想去看看大海。                                                                  —— 村上春樹
 

雙鏈表操作可移步:go雙鏈表操作

反轉:反轉鏈表戳此處

代碼:

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
	} else {
		// 鏈表的長度>=1時
		lastNode := list.Last
		lastNode.Next = newNode
		newNode.Next = nil
		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 = nil
		list.Last = last2Node
		list.Size -= 1
}

// 刪除鏈表首節點
func (list *DanList) RemoveOneNodeFront() {
	if list.Size <1 {
		return
	}
	firstNode := list.First
	list.First = firstNode.Next
	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.Size += 1
}

// 打印鏈表值
func (list *DanList) PrintDan() {
	currentNode := list.First
	fmt.Print(currentNode.Data, "\t")
	for i := 0; i < list.Size; i++ {
		if currentNode.Next == nil {
			return
		}
		currentNode = currentNode.Next
		fmt.Print(currentNode.Data, "\t")
	}
}

func main() {
	list := CreateNewDanAirList()
	fmt.Println("從末尾新增元素:")
	list.AddOneNodeToDan(17)
	list.AddOneNodeToDan(18)
	list.AddOneNodeToDan(19)
	list.AddOneNodeToDan(20)
	list.PrintDan()
	list.AddOneNodeToDan2Front(16)	// 給開頭新增元素,值爲16
	fmt.Println("\n給開頭新增一個元素作爲首節點:")
	list.PrintDan()
	list.RemoveOneNode()	// 刪除尾節點
	fmt.Println("\n刪除尾節點")
	list.PrintDan()
	fmt.Println("\n刪除首節點:")
	list.RemoveOneNodeFront()
	list.PrintDan()
}

打印:

從末尾新增元素:
17	18	19	20	
給開頭新增一個元素作爲首節點:
16	17	18	19	20	
刪除尾節點
16	17	18	19	
刪除首節點:
17	18	19	
Process finished with exit code 0

注:實現方式每個人寫出來可能在細節上有所區別,自己喜歡就好。

 

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