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