1.1.1. 一、单链表:
链表是有顺序的列表。
单链表一般有个head指向链表头,链表中的每一个元素指向下一个元素,形成一个串。
单链表的实现如下:
package main
import "fmt"
// 链表
type Persion struct {
Num int
Name string
next *Persion // 下一个节点
}
//增加一个节点,方式1:在单链表的最后加入
func InsertNode(head *Persion, newNode *Persion) {
//从head开始,查找最后一个结点(temp.next == nil 的节点)
temp := head
for {
if temp.next == nil { //表示找到最后
break
}
temp = temp.next //下一个结点
}
//将 newNode 加入到链表的最后
temp.next = newNode
}
//增加一个节点,按照num的值排序
func InsertNodeByNum(head *Persion, newNode *Persion) {
//从head开始,查找最后一个结点(temp.next == nil 的节点)
temp := head
flag := true
for {
if temp.next == nil { //表示找到最后
break
} else if temp.next.Num >= newNode.Num { //新节点在temp和temp.next之间。也就是temp后面
break
} else if temp.next.Num == newNode.Num {
//说明我们额链表中已经有这个 no,就不插入.
flag = false
break
}
temp = temp.next //下一个结点
}
if !flag {
fmt.Println("对不起,已经存在 Num=", newNode.Num)
return
} else {
newNode.next = temp.next
temp.next = newNode
}
}
//显示链表的所有结点信息
func ListNode(head *Persion) {
temp := head
// 先判断该链表是不是一个空的链表
if temp.next == nil {
fmt.Println("空空如也。。。。")
return
}
//遍历这个链表
for {
fmt.Printf("[%d , %s ]==>", temp.next.Num, temp.next.Name)
temp = temp.next
if temp.next == nil { //判断是否链表后
break
}
}
}
func main() {
//1. 先创建一个头结点
head := &Persion{}
p1 := &Persion{Num:100,Name:"张三",}
p2 := &Persion{Num:101,Name:"李四",}
p3 := &Persion{Num:99,Name:"王五",}
// 插入链表
InsertNodeByNum(head,p1)
InsertNodeByNum(head,p2)
InsertNodeByNum(head,p3)
// 显示链表
ListNode(head)
}
注意事项:
1、链表元素的数据结构。注意next指向下一个元素。
type Persion struct { Num int Name string next *Persion // 下一个节点 }
2、实现了2个插入元素的函数:InsertNode(插入链表末尾)、InsertNodeByNum(按照编号升序插入)。
3、使用的时候,创建一个head节点。head := &Persion{}。
- 给上面的单链表,增加一个删除节点的函数:
func delNodeByNum(head *Persion,num int) {
temp := head
flag := false // 是否找到节点
for {
if temp.next == nil { //表示找到最后
break
} else if temp.next.Num == num {
flag = true
break
}
temp = temp.next //下一个结点
}
if flag { // 找到,删除节点
temp.next = temp.next.next
} else {
fmt.Println("没有找到要删除的节点")
}
}
实现思想:循环链表,比较num。
1.1.2. 二、链表实现队列。
如果链表有2个函数:从尾部加元素,从头部取出元素。那就实现了一个队列。