1. package main
    2. import "fmt"
    3. type Node struct {
    4. Val int
    5. Next *Node
    6. }
    7. type List struct {
    8. HeadNode *Node
    9. }
    10. func main() {
    11. list := NewList()
    12. // ["MyLinkedList","addAtHead","addAtTail","addAtIndex","get","deleteAtIndex","get"]
    13. // [[],[1],[3],[1,2],[1],[0],[0]]
    14. list.AddAtHead(1)
    15. list.Show()
    16. list.AddAtTail(3)
    17. list.Show()
    18. list.AddAtIndex(1, 2)
    19. list.Show()
    20. fmt.Println("No.1:", list.Get(1))
    21. list.DeleteAtIndex(0)
    22. list.Show()
    23. fmt.Println("No.0:", list.Get(0))
    24. /*list.AddAtHead(1)
    25. list.Show()
    26. list.AddAtHead(2)
    27. list.Show()
    28. fmt.Println("No.0:", list.Get(0))
    29. fmt.Println("No.1:", list.Get(1))
    30. fmt.Println("No.4:", list.Get(4))
    31. list.AddAtHead(3)
    32. list.Show()
    33. list.AddAtTail(4)
    34. list.Show()
    35. fmt.Println("No.2:", list.Get(2))
    36. list.AddAtTail(5)
    37. list.Show()
    38. list.AddAtIndex(2, 0)
    39. list.Show()
    40. fmt.Println("No.3:", list.Get(3))
    41. list.DeleteAtIndex(2)
    42. list.Show()
    43. fmt.Println("No.3:", list.Get(3))*/
    44. }
    45. func NewList() *List {
    46. return &List{HeadNode: nil}
    47. }
    48. func (l *List) IsEmpty() bool {
    49. if l.HeadNode == nil {
    50. return true
    51. } else {
    52. return false
    53. }
    54. }
    55. func (l *List) GetLen() int {
    56. cur := l.HeadNode
    57. count := 0
    58. for cur != nil {
    59. cur = cur.Next
    60. count++
    61. }
    62. return count
    63. }
    64. func (l *List) Get(index int) int {
    65. if l.HeadNode == nil || index >= l.GetLen() {
    66. return -1
    67. }
    68. i := 0
    69. cur := l.HeadNode
    70. for {
    71. if i == index {
    72. return cur.Val
    73. }
    74. cur = cur.Next
    75. i++
    76. }
    77. return -1
    78. }
    79. func (l *List) AddAtHead(val int) {
    80. node := &Node{
    81. Val: val,
    82. Next: l.HeadNode,
    83. }
    84. l.HeadNode = node
    85. }
    86. func (l *List) AddAtTail(val int) {
    87. node := &Node{Val: val}
    88. if l.IsEmpty() {
    89. l.HeadNode = node
    90. } else {
    91. cur := l.HeadNode
    92. for cur.Next != nil {
    93. cur = cur.Next
    94. }
    95. cur.Next = node
    96. }
    97. }
    98. func (l *List) AddAtIndex(index, val int) {
    99. if index <= 0 {
    100. l.AddAtHead(val)
    101. return
    102. }
    103. if index > l.GetLen() {
    104. return
    105. }
    106. if index == l.GetLen() {
    107. l.AddAtTail(val)
    108. return
    109. }
    110. i := 0
    111. node := &Node{Val: val}
    112. cur := l.HeadNode
    113. for {
    114. if i+1 == index {
    115. node.Next = cur.Next
    116. cur.Next = node
    117. break
    118. }
    119. cur = cur.Next
    120. i++
    121. }
    122. }
    123. func (l *List) DeleteAtIndex(index int) {
    124. if index < 0 || l.GetLen() == 0 || index >= l.GetLen() {
    125. return
    126. }
    127. if l.GetLen() == 1 {
    128. l.HeadNode = nil
    129. return
    130. }
    131. if index == 0 {
    132. l.HeadNode = l.HeadNode.Next
    133. return
    134. }
    135. i := 0
    136. cur := l.HeadNode
    137. for {
    138. if i+1 == index {
    139. cur.Next = cur.Next.Next
    140. break
    141. }
    142. cur = cur.Next
    143. i++
    144. }
    145. }
    146. func (l *List) Show() {
    147. if l.HeadNode == nil {
    148. return
    149. }
    150. cur := l.HeadNode
    151. fmt.Print(l.GetLen(), " ")
    152. for cur != nil {
    153. fmt.Print(cur.Val, "-> ")
    154. cur = cur.Next
    155. }
    156. fmt.Println()
    157. }