单向链表的一种Go语言实现
package main
import \"fmt\"
type Node struct {
no int
name string
next *Node
}
//实现尾部插入一个节点到链表(队列Push的一种实现)
func InsertTail(head *Node, newNode *Node){
//先找到链表的最后一个节点,需要保持头结点不动,这里创建一个中间临时节点
temp := head
//遍历链表直到最后一个节点进行插入
for {
if temp.next == nil { //这个条件就是链表的最后位置
break
}
temp = temp.next
}
//将新的节点接入到链表尾部
temp.next = newNode
}
//实现有序插入一个节点到链表中
func InsertSort(head, newNode *Node){
temp := head
//重点:插入时必须要在temp的位置让temp.next.no和newNode.no进行比较,不然会错过插入时机
for {
if temp.next == nil { //说明已经在链表的尾部了
//注意:下面两行的顺序不能颠倒
newNode.next = temp.next
temp.next = newNode
break
} else if temp.next.no >= newNode.no {
newNode.next = temp.next
temp.next = newNode
break
}
temp = temp.next
}
}
//实现头部插入节点(队列Push的一种实现)
func InsertHead(head, newNode *Node){
newNode.next = head.next
head.next = newNode
}
//实现一个删除链表节点的函数
func Delete(head *Node, node *Node) {
temp := head
for {
if temp.next == nil { //说明已经在链表的尾部了,没有找到要删除的节点
break
} else if temp.next.no == node.no {
temp.next = node.next
//下面这种方法也可以,不过理解起来有点绕
//temp.next = temp.next.next
break
}
temp = temp.next
}
}
//实现一个头部删除链表节点的函数(队列Pop的一种实现)
func DeleteHead(head *Node){
if head.next == nil{
return
}else {
head.next = head.next.next
}
}
//实现一个尾部删除链表节点的函数(队列Pop的一种实现)
func DeleteTail(head *Node){
temp := head
for {
if temp.next == nil{ //说明链表为空
return
}else if temp.next.next == nil{
temp.next = nil
break
}
temp = temp.next
}
}
//实现显示链表中所有节点信息
func List(head *Node){
//前提是不能改变头结点
temp := head
if temp.next == nil {
fmt.Println(\"链表为空\")
return
}
for {
fmt.Printf(\"%d %s -->\", temp.next.no, temp.next.name) //打印下一个节点的信息
temp = temp.next
if temp.next == nil {
break
}
}
}
func main(){
//定义一个头结点
head := &Node{}
//定义一个节点信息
node1 := &Node{
no: 1,
name: \"Number1\",
next: nil,
}
node2 := &Node{
no: 2,
name: \"Number2\",
next: nil,
}
node3 := &Node{
no: 3,
name: \"Number3\",
next: nil,
}
node4 := &Node{
no: 2,
name: \"Number4\",
next: nil,
}
InsertTail(head, node1)
InsertTail(head, node2)
InsertSort(head, node3)
InsertSort(head, node2)
InsertSort(head, node1)
InsertSort(head, node4)
Delete(head, node4)
InsertHead(head, node1)
InsertHead(head, node2)
InsertHead(head, node3)
InsertHead(head, node4)
DeleteHead(head)
DeleteTail(head)
List(head)
}