package main import ( "errors" "fmt" "strconv" ) type List struct { Length int Head *Node } type Node struct { NextNode *Node Value int } func (list *List) IsEmpty() bool { return list.Length == 0 } func (list *List) Append(value int) { list.Length += 1 if list.Head == nil { list.Head = &Node{Value: value} return } lastNode := list.Head for lastNode.NextNode != nil { lastNode = lastNode.NextNode } lastNode.NextNode = &Node{Value: value} } func (list *List) Delete(index int) error { if index + 1 > list.Length { return errors.New("index out of range") } list.Length -= 1 if index == 0{ list.Head = list.Head.NextNode return nil } indexNode := list.Head for i := index; i > 1; i-- { indexNode = indexNode.NextNode } if indexNode.NextNode != nil { indexNode.NextNode = indexNode.NextNode.NextNode } else { indexNode.NextNode = nil } return nil } func (list *List) String() string { var ret string node := list.Head for node.NextNode != nil { ret += strconv.Itoa(node.Value) + "," node = node.NextNode } ret += strconv.Itoa(node.Value) return ret } func (list *List) Insert(index, value int) error { if index + 1 > list.Length { return errors.New("index out of range") } list.Length++ if index == 0{ list.Head = &Node{Value:value, NextNode:list.Head} return nil } indexNode := list.Head for i := index; i > 1; i-- { indexNode = indexNode.NextNode } tempNode := &Node{Value: value, NextNode: indexNode.NextNode} indexNode.NextNode = tempNode return nil } func main() { a := List{} for i := 0; i < 10; i++ { a.Append(i) } fmt.Println(a.String()) if err := a.Insert(9, 99); err != nil{ fmt.Println(err) } fmt.Println(a.String()) }