上代碼:
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