Go实现单链表

单链表

NNode: 包含一个数据域,一个指针域(指向下一个节点)
LList : 包含头指针 (指向第一个节点),链表长度
链表的特点:不能随机访问,只能根据链一个一个查找,查找的时间复杂度是 O (n)

示例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
// +---------------------------------------------------------------
// | Description: Go实现单链表(goLinkList.go)
// +---------------------------------------------------------------
// | Author: thomas.chen <thomas.chen@huolala.cn>
// +---------------------------------------------------------------
// | CreateTime: 2022/3/10
// +---------------------------------------------------------------

package main

import "fmt"

// NNode 定义节点的结构体
type NNode struct {
Data interface{} // 数据域
Next *NNode // 指针域
}

// LList 定义链表结构体
type LList struct {
Header *NNode // 指向第一个节点
Length int // 链表长度
}

func CreateNode(v interface{}) *NNode {
return &NNode{v, nil}
}

func CreateList() *LList {
header := CreateNode(nil)
return &LList{header, 0}
}

// Add 往链表头增加一个节点
func (l *LList) Add(data interface{}) {
newNode := CreateNode(data)
defer func() {
l.Length++
}()

if l.Length == 0 {
l.Header = newNode
} else {
newNode.Next = l.Header
l.Header = newNode // 头指针指向新加的节点
}
}

// Append 往链表尾加一个节点
func (l *LList) Append(data interface{}) {
newNode := CreateNode(data)
defer func() {
l.Length++
}()

if l.Length == 0 {
l.Header = newNode
}

if l.Length > 0 {
current := l.Header
for current.Next != nil { // 循环找到最后一个节点
current = current.Next
}
current.Next = newNode // 把新节点地址给最后一个节点的Next
}
}

// Insert 往i插入一个节点,后插
func (l *LList) Insert(i int, data interface{}) {
defer func() {
l.Length++
}()

if i >= l.Length {
l.Append(data)
return
}
newNode := CreateNode(data)
// 找到第i个节点pre和第i+1个after
j := 1
pre := l.Header
for j != i {
pre = pre.Next
j++
}
newNode.Next = pre.Next // 获取到i+1个节点
// 修改i节点,新节点的指针
pre.Next = newNode
}

// Delete 删除第i个节点
func (l *LList) Delete(i int) {
defer func() {
l.Length--
}()

if i == 1 { // 删除第一个节点,把header指向第二个节点即可
l.Header = l.Header.Next
return
}
// 找到第i-1个节点的next指向第i+1个节点即可
j := 1
current := l.Header
for ; j < i-1; j++ {
current = current.Next
}
current.Next = current.Next.Next
}

// Remove 删除指定值节点
func (l *LList) Remove(data interface{}) {
defer func() {
l.Length--
}()
current := l.Header
if current.Data == data { // 删除值恰好为第一个节点,把header指向第二个节点即可
l.Header = l.Header.Next
return
}
for current.Next != nil {
if current.Next.Data == data {
current.Next = current.Next.Next
}
current = current.Next
}
return
}

// GetListLength 获取链表长度
func (l *LList) GetListLength() int {
fmt.Printf("当前链表长度:%d\n", l.Length)
return l.Length
}

// Scan 遍历链表,显示出来
func (l *LList) Scan() {
current := l.Header
i := 1
for current.Next != nil {
fmt.Printf("第%d的节点是%d\n", i, current.Data)
current = current.Next
i++
}
fmt.Printf("第%d的节点是%d\n", i, current.Data)
}

// ShowList 打印链表
func (l *LList) ShowList() {
//打印链表
if l.Length == 0 {
fmt.Println("-> 空链表!")
return
}

current := l.Header
i := 1
for current.Next != nil {
fmt.Printf("%d -> ", current.Data)
current = current.Next
i++
}
fmt.Printf("%d -> ", current.Data)
fmt.Println("")
}

func main() {
list := CreateList()
list.Add(100)
list.Add(200)
list.Add(400)
list.Append(99)
list.Insert(1, 300)
list.Insert(5, 88)
list.Insert(5, 90)
list.ShowList()
list.GetListLength()
//list.Scan()
//list.Delete(6)
list.Remove(400)
//list.Scan()
list.ShowList()
list.GetListLength()
}

打印结果

1
2
3
4
400 -> 300 -> 200 -> 100 -> 99 -> 90 -> 88 ->
当前链表长度:8
300 -> 200 -> 100 -> 99 -> 90 -> 88 ->
当前链表长度:7

Go实现单链表
https://www.chendujin.com/posts/570a3f11.html
作者
Thomas
发布于
2022年3月10日
许可协议