每当我看着大海的时候,我总想找人谈谈。但当我和人交谈时,我又总想去看看大海。 —— 村上春树
双链表操作可移步: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
注:实现方式每个人写出来可能在细节上有所区别,自己喜欢就好。