go實現雙鏈表各操作

上代碼:

import "fmt"
/*
--操作思路--
從鏈表左邊取出一個節點:首節點指針右移一位,首節點爲nil,長度減一;
給鏈表末尾新增一個節點:以傳入的數據new一個節點,
  1,鏈表爲空時,該node作爲鏈表的首節點、尾節點;
  2,不爲空時,該節點賦值到舊的末節點的next,該節點的前置指針爲舊的末節點,該節點賦值爲鏈表的末節點,該節點的next爲nil,鏈表長度+1;
*/
type Node struct {
	Pre  *Node
	Next *Node
	Data string
}

type List struct {
	First *Node
	Last  *Node
	Size  int
}

// 從鏈表末尾取下一個節點
func (list *List) RemoveOneNode() {
	node := list.Last.Pre
	node.Next = nil
	list.Last = node
	list.Size -= 1
}

// 給鏈表末尾新增一個節點
func (list *List) AddOneNode(value string) {
	newNode := new(Node)
	newNode.Data = value

	// 鏈表爲空時
	if list.Size < 1 {
		list.First = newNode
		list.Last = newNode
	} else {
		// 鏈表的長度>=1時
		lastNode := list.Last
		lastNode.Next = newNode
		newNode.Pre = lastNode
		newNode.Next = nil
		list.Last = newNode
	}

	list.Size += 1
}

// 創建一個空的雙鏈表
func CreateNewAirList() (list *List) {
	return &List{}
}

// 打印鏈表
func (list *List) Print() {
	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 := CreateNewAirList()
	list.AddOneNode("A")
	list.AddOneNode("B")
	list.AddOneNode("C")
	fmt.Println(list.First.Data, list.First.Next.Data, list.Last.Data)		// 打印方式1
	list.Print()	// 打印方式2
}

控制檯打印:

A B C
A	B	C	

 

 

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