Go语言链表,增加了一个地址指向
image.png

基础功能

  1. // 单链表 - 增删改查
  2. package main
  3. import "fmt"
  4. // 定义节点
  5. type HeroNode struct {
  6. no int
  7. name string
  8. nickname string
  9. next *HeroNode // 表示指向下一个节点
  10. }
  11. // 添加节点
  12. func insertNode(head *HeroNode, newNode *HeroNode) {
  13. // 1. 找到链表最后的节点
  14. // 2. 创建辅助节点, 跑龙套的
  15. temp := head
  16. for {
  17. if temp.next == nil {
  18. // 最后的节点
  19. break
  20. }
  21. temp = temp.next // temp 一直后移, 直到指向链表最后的节点
  22. }
  23. // 3. 修改最后一个节点的 next 指向 newNode
  24. temp.next = newNode
  25. }
  26. // 显示链表所有节点信息
  27. func showNode(head *HeroNode) {
  28. // 1. 创建辅助节点, 跑龙套的
  29. temp := head
  30. // 2. 判断该链表是不是空的
  31. if temp.next == nil {
  32. fmt.Println("空链表")
  33. return
  34. }
  35. // 2. 遍历链表
  36. for {
  37. fmt.Printf("[%d , %s , %s] => ", temp.next.no, temp.next.name, temp.next.nickname)
  38. temp = temp.next
  39. if temp.next == nil {
  40. break
  41. }
  42. }
  43. }
  44. func main() {
  45. // 1. 创建头节点
  46. head := &HeroNode{}
  47. // 2. 创建 HeroNode
  48. hero1 := &HeroNode{
  49. no: 1,
  50. name: "luffy",
  51. nickname: "海贼王",
  52. }
  53. hero2 := &HeroNode{
  54. no: 1,
  55. name: "索隆",
  56. nickname: "大剑豪",
  57. }
  58. fmt.Println("插入节点")
  59. insertNode(head, hero1)
  60. insertNode(head, hero2)
  61. fmt.Println("显示节点")
  62. showNode(head)
  63. }
  64. /*
  65. [1 , luffy , 海贼王] => [2 , 索隆 , 大剑豪] =>
  66. */
  1. [1 , luffy , 海贼王] => [3 , 山治 , allblue] => [2 , 索隆 , 大剑豪] =>
  2. // 按顺序插入
  3. [1 , luffy , 海贼王] => [2 , 索隆 , 大剑豪] => [3 , 山治 , allblue] =>

按顺序插入

  1. // 单链表 - 增删改查
  2. package main
  3. import "fmt"
  4. // 定义节点
  5. type HeroNode struct {
  6. no int
  7. name string
  8. nickname string
  9. next *HeroNode // 表示指向下一个节点
  10. }
  11. // 添加节点
  12. func insertNode(head *HeroNode, newNode *HeroNode) {
  13. // 1. 找到链表最后的节点
  14. // 2. 创建辅助节点, 跑龙套的
  15. temp := head
  16. for {
  17. if temp.next == nil {
  18. // 最后的节点
  19. break
  20. }
  21. temp = temp.next // temp 一直后移, 直到指向链表最后的节点
  22. }
  23. // 3. 修改最后一个节点的 next 指向 newNode
  24. temp.next = newNode
  25. }
  26. // 根据 编号 no 插入到指定位置(从小到大)
  27. func insertNode02(head *HeroNode, newNode *HeroNode) {
  28. // 1. 找到链表适当的节点
  29. // 2. 创建辅助节点, 跑龙套的
  30. temp := head
  31. flag := true
  32. for {
  33. if temp.next == nil {
  34. // 最后的节点
  35. break
  36. } else if temp.next.no > newNode.no {
  37. // 升序
  38. // 降序: temp.next.no < newNode.no
  39. break
  40. } else if temp.next.no == newNode.no {
  41. fmt.Println("已经存在,不允许加入")
  42. flag = false
  43. break
  44. }
  45. temp = temp.next // temp 一直后移,
  46. }
  47. if !flag {
  48. fmt.Println("不能插入节点")
  49. return
  50. } else {
  51. // newNode 应该插入 temp.next 前面, temp后面
  52. newNode.next = temp.next
  53. temp.next = newNode
  54. }
  55. }
  56. // 显示链表所有节点信息
  57. func showNode(head *HeroNode) {
  58. // 1. 创建辅助节点, 跑龙套的
  59. temp := head
  60. // 2. 判断该链表是不是空的
  61. if temp.next == nil {
  62. fmt.Println("空链表")
  63. return
  64. }
  65. // 2. 遍历链表
  66. for {
  67. fmt.Printf("[%d , %s , %s] => ", temp.next.no, temp.next.name, temp.next.nickname)
  68. temp = temp.next
  69. if temp.next == nil {
  70. break
  71. }
  72. }
  73. }
  74. func main() {
  75. // 1. 创建头节点
  76. head := &HeroNode{}
  77. // 2. 创建 HeroNode
  78. hero1 := &HeroNode{
  79. no: 1,
  80. name: "luffy",
  81. nickname: "海贼王",
  82. }
  83. hero2 := &HeroNode{
  84. no: 2,
  85. name: "索隆",
  86. nickname: "大剑豪",
  87. }
  88. hero3 := &HeroNode{
  89. no: 3,
  90. name: "山治",
  91. nickname: "allblue",
  92. }
  93. fmt.Println("插入节点")
  94. insertNode02(head, hero1)
  95. insertNode02(head, hero3)
  96. insertNode02(head, hero2)
  97. fmt.Println("显示节点")
  98. showNode(head)
  99. }
  100. /*
  101. [1 , luffy , 海贼王] => [2 , 索隆 , 大剑豪] => [3 , 山治 , allblue] =>
  102. [3 , 山治 , allblue] => [2 , 索隆 , 大剑豪] => [1 , luffy , 海贼王] =>
  103. */

删除指定节点

  1. // 单向链表 - 增删改查
  2. package main
  3. import (
  4. "fmt"
  5. )
  6. // 定义节点
  7. type HeroNode struct {
  8. no int
  9. name string
  10. nickname string
  11. next *HeroNode // 表示指向下一个节点
  12. }
  13. // 添加节点
  14. func insertNode(head *HeroNode, newNode *HeroNode) {
  15. // 1. 找到链表最后的节点
  16. // 2. 创建辅助节点, 跑龙套的
  17. temp := head
  18. for {
  19. if temp.next == nil {
  20. // 最后的节点
  21. break
  22. }
  23. temp = temp.next // temp 一直后移, 直到指向链表最后的节点
  24. }
  25. // 3. 修改最后一个节点的 next 指向 newNode
  26. temp.next = newNode
  27. }
  28. // 根据 编号 no 插入到指定位置(从小到大)
  29. func insertNode02(head *HeroNode, newNode *HeroNode) {
  30. // 1. 找到链表适当的节点
  31. // 2. 创建辅助节点, 跑龙套的
  32. temp := head
  33. flag := true
  34. for {
  35. if temp.next == nil {
  36. // 最后的节点
  37. break
  38. } else if temp.next.no > newNode.no {
  39. // 升降序, 只需要修改 temp.next.no < newNode.no
  40. break
  41. } else if temp.next.no == newNode.no {
  42. fmt.Printf("节点: %v, 已经存在,不允许加入\n", newNode.no)
  43. flag = false
  44. break
  45. }
  46. temp = temp.next // temp 一直后移,
  47. }
  48. if !flag {
  49. fmt.Println("不能插入节点")
  50. return
  51. } else {
  52. // newNode 应该插入 temp.next 前面, temp后面
  53. newNode.next = temp.next
  54. temp.next = newNode
  55. }
  56. }
  57. // 删除节点
  58. func delNode(head *HeroNode, id int) {
  59. // 1. 先来一个跑龙套的
  60. temp := head
  61. flag := false
  62. // 2. 找到要删除的节点
  63. for {
  64. if temp.next == nil {
  65. break
  66. } else if temp.next.no == id {
  67. // 找到了
  68. flag = true
  69. break
  70. }
  71. temp = temp.next
  72. }
  73. if flag {
  74. // 删除, 更改节点指向
  75. temp.next = temp.next.next
  76. } else {
  77. fmt.Println("要删除的节点id不存在")
  78. }
  79. }
  80. // 显示链表所有节点信息
  81. func showNode(head *HeroNode) {
  82. // 1. 创建辅助节点, 跑龙套的
  83. temp := head
  84. // 2. 判断该链表是不是空的
  85. if temp.next == nil {
  86. fmt.Println("空链表")
  87. return
  88. }
  89. // 2. 遍历链表
  90. for {
  91. fmt.Printf("[%d , %s , %s] => ", temp.next.no, temp.next.name, temp.next.nickname)
  92. temp = temp.next
  93. if temp.next == nil {
  94. break
  95. }
  96. }
  97. fmt.Println()
  98. }
  99. func main() {
  100. // 1. 创建头节点
  101. head := &HeroNode{}
  102. // 2. 创建 HeroNode
  103. hero1 := &HeroNode{
  104. no: 1,
  105. name: "luffy",
  106. nickname: "海贼王",
  107. }
  108. hero2 := &HeroNode{
  109. no: 2,
  110. name: "索隆",
  111. nickname: "大剑豪",
  112. }
  113. hero3 := &HeroNode{
  114. no: 3,
  115. name: "山治",
  116. nickname: "allblue",
  117. }
  118. hero4 := &HeroNode{
  119. no: 4,
  120. name: "甚平",
  121. nickname: "海侠",
  122. }
  123. fmt.Println("按顺序插入节点")
  124. insertNode02(head, hero1)
  125. insertNode02(head, hero3)
  126. insertNode02(head, hero2)
  127. insertNode02(head, hero4)
  128. insertNode02(head, hero1)
  129. showNode(head)
  130. fmt.Println("删除指定节点")
  131. delNode(head, 3)
  132. showNode(head)
  133. }
  134. /*
  135. [1 , luffy , 海贼王] => [2 , 索隆 , 大剑豪] =>
  136. */
  137. /*
  138. 按顺序插入节点
  139. 节点: 1, 已经存在,不允许加入
  140. 不能插入节点
  141. [1 , luffy , 海贼王] => [2 , 索隆 , 大剑豪] => [3 , 山治 , allblue] => [4 , 甚平 , 海侠] =>
  142. 删除指定节点
  143. [1 , luffy , 海贼王] => [2 , 索隆 , 大剑豪] => [4 , 甚平 , 海侠] =>
  144. */