自删除

代码实现

  1. // 双向循环链表
  2. package main
  3. import "fmt"
  4. type CatNode struct {
  5. no int
  6. name string
  7. pre *CatNode
  8. next *CatNode
  9. }
  10. // 按顺序插入
  11. func insertNode02(head *CatNode, newCatNode *CatNode) {
  12. // 1. 处理第一个节点(头节点有值)
  13. if head.next == nil {
  14. head.no = newCatNode.no
  15. head.name = newCatNode.name
  16. head.next = head // 构成环形
  17. head.pre = head
  18. fmt.Printf("第一个节点: 猫: %v 加入环形链表 \n", newCatNode.name)
  19. return
  20. }
  21. // 2. 处理别的节点
  22. // 定义临时变量
  23. temp := head
  24. flag := true
  25. for {
  26. if temp.no == newCatNode.no {
  27. fmt.Printf("节点: %v , 已经存在,不允许加入", newCatNode.no)
  28. flag = false
  29. break
  30. } else if temp.next == head {
  31. break
  32. } else if temp.next.no > newCatNode.no {
  33. break
  34. } else if temp.next.no == newCatNode.no {
  35. fmt.Printf("节点: %v , 已经存在,不允许加入\n", newCatNode.no)
  36. flag = false
  37. break
  38. }
  39. temp = temp.next
  40. }
  41. // 加入到链表
  42. // temp.next = newCatNode
  43. // newCatNode.next = head
  44. if !flag {
  45. fmt.Println("不能插入节点")
  46. return
  47. } else {
  48. // 最后一个节点后插入
  49. if temp.next == head {
  50. temp.next = newCatNode
  51. newCatNode.pre = temp
  52. newCatNode.next = head
  53. head.pre = newCatNode
  54. } else {
  55. // 中间节点插入
  56. newCatNode.next = temp.next
  57. temp.next.pre = newCatNode
  58. temp.next = newCatNode
  59. newCatNode.pre = temp
  60. }
  61. }
  62. }
  63. // 双向环形链表 自删除节点, 更新头节点
  64. func delNode(head *CatNode, id int) *CatNode {
  65. // 这里的头节点是有值的
  66. fmt.Println("delNode - head: ", head)
  67. temp := head
  68. // 1. 空链表
  69. if temp.next == nil {
  70. fmt.Println("空链表")
  71. return head
  72. }
  73. // 2. 删除
  74. for {
  75. if temp.next == head {
  76. temp.next = nil
  77. break
  78. }
  79. if temp.no == id {
  80. if temp == head {
  81. // 删除的是头节点, 修改头节点的指向
  82. head = temp.next
  83. }
  84. temp.pre.next = temp.next
  85. temp.next.pre = temp.pre
  86. fmt.Printf("猫: no: %v 被移除链表了 \n", id)
  87. break
  88. }
  89. temp = temp.next
  90. }
  91. return head
  92. }
  93. // 显示所有节点
  94. func showNode(head *CatNode) {
  95. temp := head
  96. if temp.next == nil {
  97. fmt.Println("空链表")
  98. return
  99. }
  100. for {
  101. fmt.Printf("[猫: no: %v, name: %v] => ", temp.no, temp.name)
  102. if temp.next == head {
  103. break
  104. }
  105. temp = temp.next
  106. }
  107. fmt.Println()
  108. }
  109. func main() {
  110. // 初始化环形链表头节点
  111. head := &CatNode{}
  112. cat1 := &CatNode{
  113. no: 1,
  114. name: "tom1",
  115. }
  116. cat2 := &CatNode{
  117. no: 2,
  118. name: "tom2",
  119. }
  120. cat3 := &CatNode{
  121. no: 3,
  122. name: "tom3",
  123. }
  124. insertNode02(head, cat1)
  125. insertNode02(head, cat3)
  126. insertNode02(head, cat2)
  127. insertNode02(head, cat3)
  128. fmt.Println("显示")
  129. showNode(head)
  130. fmt.Println("删除 1")
  131. // 删除之后,重新制定 头节点 head
  132. head = delNode(head, 1)
  133. showNode(head)
  134. }
  135. /*
  136. 第一个节点: 猫: tom1 加入环形链表
  137. 节点: 3 , 已经存在,不允许加入
  138. 不能插入节点
  139. 显示
  140. [猫: no: 1, name: tom1] => [猫: no: 2, name: tom2] => [猫: no: 3, name: tom3] =>
  141. 删除 1
  142. delNode - head: &{1 tom1 0xc000076510 0xc0000764e0}
  143. 猫: no: 1 被移除链表了
  144. [猫: no: 2, name: tom2] => [猫: no: 3, name: tom3] =>
  145. */