1. package link_list
    2. import "fmt"
    3. type LinkNode struct {
    4. Value interface{}
    5. Next *LinkNode
    6. }
    7. type NodeList struct {
    8. Node *LinkNode
    9. Length int
    10. }
    11. func NewLinkNode() *LinkNode {
    12. return &LinkNode{Value: 0, Next: nil}
    13. }
    14. // 获取链表的值
    15. func (l *LinkNode) GetValue() interface{} {
    16. return l.Value
    17. }
    18. // 获取链表的下一个节点
    19. func (l *LinkNode) GetNode() *LinkNode {
    20. return l.Next
    21. }
    22. func NewNodeList() *NodeList {
    23. return &NodeList{Node: NewLinkNode(), Length: 0}
    24. }
    25. // 在某个节点后面插入节点
    26. func (n *NodeList) InsertAfterNode(node *LinkNode, value interface{}) bool {
    27. if node == nil {
    28. return false
    29. }
    30. newNode := NewLinkNode()
    31. newNode.Value = value
    32. newNode.Next = node.Next
    33. node.Next = newNode
    34. n.Length++
    35. return true
    36. }
    37. // 在某个节点前面插入节点
    38. func (n *NodeList) InsertBeforeNode(node *LinkNode, value interface{}) bool {
    39. if node == nil || node == n.Node {
    40. return false
    41. }
    42. // 获取全部的节点,与传入的节点进行比较
    43. cur := n.Node.Next
    44. pre := n.Node
    45. for cur != nil {
    46. if cur == node {
    47. break
    48. }
    49. pre = cur
    50. cur = cur.Next
    51. }
    52. if cur == nil {
    53. return false
    54. }
    55. // 此时cur节点就是p节点
    56. newNode := NewLinkNode()
    57. newNode.Next = cur
    58. newNode.Value = value
    59. pre.Next = newNode
    60. n.Length++
    61. return true
    62. }
    63. // 在链表的头部插入节点
    64. func (n *NodeList) InsertHeadNode(v interface{}) {
    65. n.InsertAfterNode(n.Node, v)
    66. }
    67. // 在链表尾部插入节点
    68. func (n *NodeList) InsertTailNode(v interface{}) {
    69. cur := n.Node
    70. for cur.Next != nil {
    71. cur = cur.Next
    72. }
    73. n.InsertAfterNode(cur, v)
    74. }
    75. // 删除传入的节点
    76. func (n *NodeList) DelNode(node *LinkNode) bool {
    77. if node == nil {
    78. return false
    79. }
    80. cur := n.Node.Next
    81. pre := n.Node
    82. for nil != cur {
    83. if cur == node {
    84. break
    85. }
    86. pre = cur
    87. cur = cur.Next
    88. }
    89. if cur == nil {
    90. return false
    91. }
    92. pre.Next = cur.Next
    93. n.Length--
    94. return true
    95. }
    96. // 遍历所有的节点
    97. func (n *NodeList) Print() {
    98. cur := n.Node.Next
    99. var format = ""
    100. for cur != nil {
    101. format += fmt.Sprintf("%+v", cur.GetValue())
    102. cur = cur.Next
    103. if nil != cur {
    104. format += "->"
    105. }
    106. }
    107. fmt.Println(format)
    108. }
    109. // 测试用例
    110. func TestList(t *testing.T) {
    111. nodeList := NewNodeList()
    112. nodeList.InsertAfterNode(nodeList.Node, 1)
    113. nodeList.InsertAfterNode(nodeList.Node.Next, 2)
    114. nodeList.InsertAfterNode(nodeList.Node.Next.Next, 3)
    115. nodeList.InsertBeforeNode(nodeList.Node.Next.Next, 4)
    116. nodeList.InsertHeadNode(5)
    117. nodeList.InsertTailNode(6)
    118. nodeList.DelNode(nodeList.Node.Next.Next)
    119. nodeList.Print()
    120. fmt.Println(nodeList.Length)
    121. }
    122. // 测试结果 5->4->2->3->6 5