介绍

链表是有序的队列, 他在内存中的分布
image.png

  1. package main
  2. import (
  3. "fmt"
  4. "os"
  5. )
  6. type Node struct {
  7. No int
  8. Data string
  9. next *Node
  10. }
  11. // 链表最后追加一个节点
  12. func AddNode(head *Node, nextNode *Node) {
  13. temp := head
  14. for {
  15. if temp.next == nil {
  16. break
  17. }
  18. temp = temp.next
  19. }
  20. temp.next = nextNode
  21. }
  22. // 中间插入节点
  23. func InsertNode(head *Node, nextNode *Node) {
  24. temp := head
  25. flag := true
  26. for {
  27. if temp.next == nil {
  28. break
  29. } else if temp.next.No > nextNode.No {
  30. break
  31. } else if temp.No == nextNode.No {
  32. flag = false
  33. break
  34. }
  35. temp = temp.next
  36. }
  37. if !flag {
  38. fmt.Printf("已经存在", nextNode.No)
  39. return
  40. }
  41. nextNode.next = temp.next
  42. temp.next = nextNode
  43. }
  44. func deleteNode(head *Node, delNode *Node) {
  45. temp := head
  46. flag := false
  47. for {
  48. if temp.next == nil{
  49. break
  50. } else if temp.next.No == delNode.No {
  51. flag = true
  52. break
  53. }
  54. temp = temp.next
  55. }
  56. if !flag {
  57. fmt.Printf("没有找到该节点 %v \n" , delNode.No)
  58. return
  59. }
  60. temp.next = temp.next.next
  61. return
  62. }
  63. func ListNode(head *Node) {
  64. temp := head
  65. for {
  66. if temp.next == nil {
  67. fmt.Printf("没有节点了! \n")
  68. break
  69. }
  70. temp = temp.next
  71. fmt.Printf("node : %v \n", temp)
  72. }
  73. }
  74. func main() {
  75. head := &Node{}
  76. var key string
  77. var cont string
  78. var no int
  79. for {
  80. fmt.Printf("输入节点操作 \n")
  81. fmt.Printf("add\n")
  82. fmt.Printf("show\n")
  83. fmt.Printf("delete\n")
  84. fmt.Printf("exit\n")
  85. fmt.Scanln(&key)
  86. switch key {
  87. case "add":
  88. fmt.Printf("输入节点内容:")
  89. fmt.Scanln(&cont)
  90. fmt.Printf("输入节点no:")
  91. fmt.Scanln(&no)
  92. nextNode := &Node{
  93. No: no,
  94. Data: cont,
  95. }
  96. //AddNode(head, nextNode)
  97. InsertNode(head, nextNode)
  98. case "show":
  99. ListNode(head)
  100. case "delete":
  101. fmt.Printf("输入节点 no:")
  102. fmt.Scanln(&no)
  103. delNode := &Node{
  104. No: no,
  105. }
  106. deleteNode(head, delNode)
  107. case "exit":
  108. os.Exit(0)
  109. }
  110. }
  111. }