首先,我們知道鏈表的特性,分別有單線鏈表和雙線鏈表,下面我用golang來模擬了一個單線鏈表
鏈表的添加,他其實分別是有頭部插入法和尾部插入法的,我在代碼中都寫了這兩個方法
結構體 Student 是必須要有一個指針,這個指針是指向下一個鏈表的,當然,如果是雙向鏈表的話,這裏還需要記錄一個頭部指針,也就是說這個結構體會有兩個指針
type Student struct {
Name string
Age int
Score float32
next *Student
}
一個小細節:在插入某一個節點,比如 a b c 三個節點,我需要插入一個d 在 a 和 b 之間,這時候遍歷到b 之後再進行插入,不然你如果在a的時候就開始進行插入操作,那麼你是獲取不到b節點的尾部的
雙向鏈表
完整的代碼:
package main
import (
"fmt"
"math/rand"
)
/*
鏈表的結構
*/
type Student struct {
Name string
Age int
Score float32
next *Student
}
/*
尾部插入法
*/
func insertTail(p *Student) {
var tail = p // 初始化節點
for i := 0; i < 10; i++ {
stu := Student{
Name: fmt.Sprintf("stu%d", i),
Age: rand.Intn(100),
Score: rand.Float32() * 100,
}
tail.next = &stu
tail = &stu // 需要把tail弄到新的節點重新初始化
}
}
/*
遍歷鏈表
*/
func trans(p *Student) {
for p != nil {
fmt.Println(*p)
p = p.next
}
}
/*
頭部插入法
*/
func insertHead(p **Student) {
for i := 0; i < 10; i++ {
stu := Student{
Name: fmt.Sprintf("stu%d", i),
Age: rand.Intn(100),
Score: rand.Float32() * 100,
}
stu.next = *p
*p = &stu
}
}
/*
刪除節點 這裏會有個問題,就是頭節點不能刪除
*/
func delNode(p *Student) {
var prev *Student = p // 這個是臨時變量,保存上一個節點
for p != nil {
if p.Name == "stu6" {
prev.next = p.next // 上一個節點就等於下一個節點
break
}
prev = p // 這個是記錄每次循環中的自己
p = p.next
}
}
/*
在指定節點插入一個節點
*/
func addNode(p *Student, newNode *Student) {
for p != nil {
if p.Name == "stu5" {
newNode.next = p.next //新節點的next等於當前節點的next
p.next = newNode // 當前節點的next等於新節點的結構體
break
}
p = p.next
}
}
func main() {
var head *Student = new(Student) // 頭節點
head.Age = 18
head.Score = 99
head.Name = "asdsad"
insertHead(&head) // 添加一些節點 循環去添加吧,模擬
delNode(&head) // 刪除某一個鏈表
var newNode *Student = new(Student) // 插入一個節點
newNode.Age = 18
newNode.Score = 99
newNode.Name = "stu1000"
addNode(head, newNode) // 插入節點
trans(head) // 遍歷
}