1 package main
2
3 import "fmt"
4
5 type Object interface{}
6
7 type Node struct {
8 data Object
9 next *Node
10 }
11
12 type List struct {
13 headNode *Node
14 }
15
16 func NewNode(data Object, next *Node) *Node {
17 return &Node{data, next}
18 }
19
20 func (list *List) IsEmpty() bool {
21 return list.headNode == nil
22 }
23 //增加节点
24 func (list *List) Add(node *Node) *List {
25 headNode := list.headNode
26 if headNode.next != nil {
27 node.next = headNode.next
28 }
29 headNode.next = node
30 return list
31 }
32
33 func (list *List) Append(node *Node) *List {
34 if list.IsEmpty() {
35 list.headNode = node
36 return list
37 }
38 curNode := list.headNode
39 for curNode.next != nil {
40 curNode = curNode.next
41 }
42 curNode.next = node
43 return list
44 }
45 //插入数据
46 func (list *List) Insert(index int, data Object) {
47 if (index >= 0 && index < list.Length()) {
48 count := 0
49 if !list.IsEmpty() {
50 curNode := list.headNode
51 for curNode != nil && count < index {
52 count++
53 curNode = curNode.next
54 }
55 node := NewNode(data, curNode.next)
56 curNode.next = node
57 }
58 }
59 }
60 //根据index下标移除节点
61 func (list *List) Remove(index int) {
62 if (index >= 0 && index < list.Length()) {
63 count := 0
64 if !list.IsEmpty() {
65 curNode := list.headNode
66 for curNode != nil && count < index-1 {
67 count++
68 curNode = curNode.next
69 }
70 curNode.next = curNode.next.next
71 }
72 }
73 }
74 //遍历链表
75 func PrintList(list *List) {
76 cur := list.headNode
77 for cur != nil {
78 fmt.Println(cur.data)
79 cur = cur.next
80 }
81 }
82 //计算链表长度
83 func (list *List) Length() int {
84 var length int
85 curNode := list.headNode
86 for curNode != nil {
87 length++
88 curNode = curNode.next
89 }
90 return length
91 }
92 //翻转链表
93 func ReverseList(head *Node) *Node {
94 cur := head
95 var pre *Node = nil
96 for cur != nil {
97 pre, cur, cur.next = cur, cur.next, pre
98 }
99 return cur
100 }
101
102 func main(){
103 fmt.Println("NewNode======================")
104 node := NewNode(1, nil)
105 fmt.Println(node.data)
106 list := &List{node}
107 PrintList(list)
108 node2 := NewNode("a", nil)
109 list.Append(node2)
110 fmt.Println("Add======================")
111 PrintList(list)
112 node1 := NewNode(2, nil)
113 list.Add(node1)
114 fmt.Println("Length======================")
115 PrintList(list)
116 fmt.Println(list.Length())
117 fmt.Println("Insert======================")
118 list.Insert(1, 4)
119 PrintList(list)
120 fmt.Println("Remove======================")
121 list.Remove(2)
122 PrintList(list)
123 fmt.Println("ReverseList======================")
124 ReverseList(node)
125 PrintList(list)
126 }