雙向鏈表
尚硅谷Golang課
雙向鏈表
type HeroNode struct {
no int
name string
pre *HeroNode //表示指向前一個節點
next *HeroNode //表示指向下一個節點
}
//給鏈表插入節點
func Insert(head *HeroNode, newHeroNode *HeroNode) {
//先找到最後的節點,創建一個輔助
temp := head
for {
if temp.next == nil { //表示找到最後
break
}
temp = temp.next //不斷往下找
}
//把newHeroNode加到屁股
temp.next = newHeroNode
newHeroNode.pre = temp
}
//根據No從小到大插入
func InsertNo(head *HeroNode, newHeroNode *HeroNode) {
//想找到適當的節點,創建一個輔助
temp := head
for {
if temp.next == nil { //表示找到最後
break
} else if temp.next.no > newHeroNode.no {
//表示new要插到temp後
break
} else if temp.next.no == newHeroNode.no {
//表示new這個編號已存在
fmt.Println(newHeroNode.no, "該編號已存在")
return
}
temp = temp.next //不斷往下找
}
//把newHeroNode加到找到的地方
newHeroNode.next = temp.next
newHeroNode.pre = temp
if temp.next != nil {
temp.next.pre = newHeroNode //temp的下一個的前一個=新
}
temp.next = newHeroNode
}
//根據no刪除一個節點
func DelHeroNode(head *HeroNode, id int) {
//想找到適當的節點,創建一個輔助
temp := head
for {
if temp.next == nil { //表示找到最後
break
} else if temp.next.no == id {
//表示找到了
fmt.Println(id, "該編號已刪除")
temp.next = temp.next.next
if temp.next != nil {
temp.next.pre = temp
}
return
}
temp = temp.next //不斷往下找
}
}
//顯示
func List(head *HeroNode) {
//創建一個輔助
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 { //到尾了
fmt.Println("完畢")
break
}
}
}
func main() {
//創建一個頭節點(空的)
head := &HeroNode{}
hero1 := &HeroNode{
no: 1,
name: "宋江",
}
hero2 := &HeroNode{
no: 2,
name: "李奎",
}
hero3 := &HeroNode{
no: 3,
name: "李軌",
}
InsertNo(head, hero3)
InsertNo(head, hero1)
InsertNo(head, hero2)
List(head)
DelHeroNode(head, 3)
List(head)
}
上次修改於 2021-09-01
此篇文章的評論功能已經停用。