package mainimport "fmt"type Node struct { Val int Prev *Node Next *Node}type List struct { Head *Node Tail *Node Length int}func main() { list := Constructor() list.Show() fmt.Println("No.-1: ", list.Get(-1)) fmt.Println("No.0: ", list.Get(0)) fmt.Println("No.1: ", list.Get(1)) list.AddAtHead(1) list.Show() fmt.Println("No.-1: ", list.Get(-1)) fmt.Println("No.0: ", list.Get(0)) fmt.Println("No.1: ", list.Get(1)) list.AddAtHead(2) list.Show() fmt.Println("No.-1: ", list.Get(-1)) fmt.Println("No.0: ", list.Get(0)) fmt.Println("No.1: ", list.Get(1)) list.AddAtHead(3) list.Show() fmt.Println("No.-1: ", list.Get(-1)) fmt.Println("No.0: ", list.Get(0)) fmt.Println("No.1: ", list.Get(1)) fmt.Println("No.2: ", list.Get(2)) fmt.Println("No.3: ", list.Get(3)) fmt.Println("No.4: ", list.Get(4)) list.AddAtTail(4) list.AddAtTail(5) list.AddAtTail(6) list.Show() fmt.Println("No.-1: ", list.Get(-1)) fmt.Println("No.0: ", list.Get(0)) fmt.Println("No.1: ", list.Get(1)) fmt.Println("No.2: ", list.Get(2)) fmt.Println("No.3: ", list.Get(3)) fmt.Println("No.4: ", list.Get(4)) fmt.Println("No.5: ", list.Get(5)) fmt.Println("No.6: ", list.Get(6)) list.AddAtIndex(3, 9) list.AddAtIndex(0, 8) list.AddAtIndex(-1, 9) list.AddAtIndex(0, 8) list.AddAtIndex(20, 20) list.AddAtIndex(10, 10) list.Show() list.DeleteAtIndex(-1) list.DeleteAtIndex(0) list.DeleteAtIndex(2) list.DeleteAtIndex(8) list.DeleteAtIndex(8) list.Show()}func Constructor() *List { head := &Node{ Val: 0, Prev: nil, Next: nil, } tail := &Node{ Val: 0, Prev: nil, Next: nil, } head.Next = tail tail.Prev = head list := &List{ Head: head, Tail: tail, Length: 0, } return list}func (list *List) Get(index int) (val int) { if list.Head.Next == list.Tail { return -1 } count := 0 node := list.Head.Next for node != list.Tail { if count == index { return node.Val } count++ node = node.Next } return -1}func (list *List) AddAtHead(val int) { node := &Node{ Val: val, Prev: list.Head, Next: list.Head.Next, } list.Head.Next.Prev = node list.Head.Next = node list.Length++}func (list *List) AddAtTail(val int) { node := &Node{ Val: val, Prev: list.Tail.Prev, Next: list.Tail, } list.Tail.Prev.Next = node list.Tail.Prev = node list.Length++}func (list *List) AddAtIndex(index int, val int) { if index <= 0 { list.AddAtHead(val) return } if index > list.Length { return } if index == list.Length { list.AddAtTail(val) return } node := &Node{ Val: val, Prev: nil, Next: nil, } count := 0 listNode := list.Head.Next for listNode != list.Tail { if count == index-1 { node.Prev = listNode node.Next = listNode.Next listNode.Next.Prev = node listNode.Next = node list.Length++ } listNode = listNode.Next count++ }}func (list *List) DeleteAtIndex(index int) { if index < 0 || index > list.Length { return } count := 0 node := list.Head.Next for node != list.Tail { if count == index { nodePrev := node.Prev nodeNext := node.Next nodePrev.Next = nodeNext nodeNext.Prev = nodePrev list.Length-- } node = node.Next count++ }}func (list *List) Show() { node := list.Head for node != nil { fmt.Printf("%d -> ", node.Val) node = node.Next } fmt.Println() node = list.Head for node != nil { fmt.Printf("%p %v\n", node, node) node = node.Next }}