1. package main
    2. import "fmt"
    3. type Node struct {
    4. Val int
    5. Prev *Node
    6. Next *Node
    7. }
    8. type List struct {
    9. Head *Node
    10. Tail *Node
    11. Length int
    12. }
    13. func main() {
    14. list := Constructor()
    15. list.Show()
    16. fmt.Println("No.-1: ", list.Get(-1))
    17. fmt.Println("No.0: ", list.Get(0))
    18. fmt.Println("No.1: ", list.Get(1))
    19. list.AddAtHead(1)
    20. list.Show()
    21. fmt.Println("No.-1: ", list.Get(-1))
    22. fmt.Println("No.0: ", list.Get(0))
    23. fmt.Println("No.1: ", list.Get(1))
    24. list.AddAtHead(2)
    25. list.Show()
    26. fmt.Println("No.-1: ", list.Get(-1))
    27. fmt.Println("No.0: ", list.Get(0))
    28. fmt.Println("No.1: ", list.Get(1))
    29. list.AddAtHead(3)
    30. list.Show()
    31. fmt.Println("No.-1: ", list.Get(-1))
    32. fmt.Println("No.0: ", list.Get(0))
    33. fmt.Println("No.1: ", list.Get(1))
    34. fmt.Println("No.2: ", list.Get(2))
    35. fmt.Println("No.3: ", list.Get(3))
    36. fmt.Println("No.4: ", list.Get(4))
    37. list.AddAtTail(4)
    38. list.AddAtTail(5)
    39. list.AddAtTail(6)
    40. list.Show()
    41. fmt.Println("No.-1: ", list.Get(-1))
    42. fmt.Println("No.0: ", list.Get(0))
    43. fmt.Println("No.1: ", list.Get(1))
    44. fmt.Println("No.2: ", list.Get(2))
    45. fmt.Println("No.3: ", list.Get(3))
    46. fmt.Println("No.4: ", list.Get(4))
    47. fmt.Println("No.5: ", list.Get(5))
    48. fmt.Println("No.6: ", list.Get(6))
    49. list.AddAtIndex(3, 9)
    50. list.AddAtIndex(0, 8)
    51. list.AddAtIndex(-1, 9)
    52. list.AddAtIndex(0, 8)
    53. list.AddAtIndex(20, 20)
    54. list.AddAtIndex(10, 10)
    55. list.Show()
    56. list.DeleteAtIndex(-1)
    57. list.DeleteAtIndex(0)
    58. list.DeleteAtIndex(2)
    59. list.DeleteAtIndex(8)
    60. list.DeleteAtIndex(8)
    61. list.Show()
    62. }
    63. func Constructor() *List {
    64. head := &Node{
    65. Val: 0,
    66. Prev: nil,
    67. Next: nil,
    68. }
    69. tail := &Node{
    70. Val: 0,
    71. Prev: nil,
    72. Next: nil,
    73. }
    74. head.Next = tail
    75. tail.Prev = head
    76. list := &List{
    77. Head: head,
    78. Tail: tail,
    79. Length: 0,
    80. }
    81. return list
    82. }
    83. func (list *List) Get(index int) (val int) {
    84. if list.Head.Next == list.Tail {
    85. return -1
    86. }
    87. count := 0
    88. node := list.Head.Next
    89. for node != list.Tail {
    90. if count == index {
    91. return node.Val
    92. }
    93. count++
    94. node = node.Next
    95. }
    96. return -1
    97. }
    98. func (list *List) AddAtHead(val int) {
    99. node := &Node{
    100. Val: val,
    101. Prev: list.Head,
    102. Next: list.Head.Next,
    103. }
    104. list.Head.Next.Prev = node
    105. list.Head.Next = node
    106. list.Length++
    107. }
    108. func (list *List) AddAtTail(val int) {
    109. node := &Node{
    110. Val: val,
    111. Prev: list.Tail.Prev,
    112. Next: list.Tail,
    113. }
    114. list.Tail.Prev.Next = node
    115. list.Tail.Prev = node
    116. list.Length++
    117. }
    118. func (list *List) AddAtIndex(index int, val int) {
    119. if index <= 0 {
    120. list.AddAtHead(val)
    121. return
    122. }
    123. if index > list.Length {
    124. return
    125. }
    126. if index == list.Length {
    127. list.AddAtTail(val)
    128. return
    129. }
    130. node := &Node{
    131. Val: val,
    132. Prev: nil,
    133. Next: nil,
    134. }
    135. count := 0
    136. listNode := list.Head.Next
    137. for listNode != list.Tail {
    138. if count == index-1 {
    139. node.Prev = listNode
    140. node.Next = listNode.Next
    141. listNode.Next.Prev = node
    142. listNode.Next = node
    143. list.Length++
    144. }
    145. listNode = listNode.Next
    146. count++
    147. }
    148. }
    149. func (list *List) DeleteAtIndex(index int) {
    150. if index < 0 || index > list.Length {
    151. return
    152. }
    153. count := 0
    154. node := list.Head.Next
    155. for node != list.Tail {
    156. if count == index {
    157. nodePrev := node.Prev
    158. nodeNext := node.Next
    159. nodePrev.Next = nodeNext
    160. nodeNext.Prev = nodePrev
    161. list.Length--
    162. }
    163. node = node.Next
    164. count++
    165. }
    166. }
    167. func (list *List) Show() {
    168. node := list.Head
    169. for node != nil {
    170. fmt.Printf("%d -> ", node.Val)
    171. node = node.Next
    172. }
    173. fmt.Println()
    174. node = list.Head
    175. for node != nil {
    176. fmt.Printf("%p %v\n", node, node)
    177. node = node.Next
    178. }
    179. }