package main
import "fmt"
type Node struct {
data int
next *Node
}
//尾插法
func InsertToTailNoHeadNode(head *Node, newNode *Node) *Node {
temp := head //借助辅助节点,为什么要借助啊,你如果还是用head去做遍历操作,链就断了
if head == nil { //第一个节点插入的时候会走这里
head = newNode
} else {
for {
if temp.next != nil { //找到链表最后一个节点
temp = temp.next
} else {
break
}
}
temp.next = newNode //把新节点挂在之前链表的最后一个节点
}
return head
}
//头插法
func InsertToHeadNoHeadNode(head *Node, newNode *Node) *Node {
if head == nil { //说明这是一个空指针
head = newNode //当第一个节点来了,把第一个节点的地址赋给head,就代表head指针指向第一个节点
} else {
newNode.next = head //这一步好好体会,这是代表新来的节点指向了后面的节点A;有人不理解,说这不是head的么;此时的head也是指向A
head = newNode //改变head值,指向新来的节点,跟上一步串联起来来,链就形成了
}
return head
}
func PrintList(head *Node) {
temp := head
for {
fmt.Printf("->%d", temp.data)
if temp.next == nil {
break
}
temp = temp.next
}
}
func GetNode(x int) *Node {
return &Node{
data: x,
next: nil,
}
}
func abc(nomal int) {
nomal++
}
func main() {
var head *Node //这中形式是头指针,此时是空指针,不指向任何地址
//要用head来迭代,因为go不像C那样,没有全局变量来保存
head = InsertToTailNoHeadNode(head, GetNode(7))
head = InsertToTailNoHeadNode(head, GetNode(8))
head = InsertToTailNoHeadNode(head, GetNode(9))
head = InsertToHeadNoHeadNode(head, GetNode(2))
head = InsertToHeadNoHeadNode(head, GetNode(3))
head = InsertToHeadNoHeadNode(head, GetNode(4))
head = InsertToHeadNoHeadNode(head, GetNode(5))
head = InsertToHeadNoHeadNode(head, GetNode(6))
PrintList(head) //head指向head的第一个节点
}
初学者不带头节点的插入理解起来比带头节点要困难,画一画图,标出地址,一步一步拆解; 另外,这里插入函数有返回值,需要迭代,代码中也有解释。