571
社区成员
发帖
与我相关
我的任务
分享1.数据类型定义
type LinkTableNode struct { //链表结点定义
data int
next *LinkTableNode
}
type LinkTable struct { //链表定义
length int
head *LinkTableNode
}
2.创建链表
初始化链表:
func Init() *LinkTable { //初始化链表
var list *LinkTable = new(LinkTable)
list.head = nil
list.length = 0
return list
}
头插法插入结点:
func AddHead(linkTable *LinkTable, data int) { //头插法插入结点
var node = new(LinkTableNode)
node.data = data
var p = linkTable.head
if p == nil {
linkTable.head = node
} else {
node.next = p
linkTable.head = node
}
linkTable.length++
}
3.删除操作
删除整个链表:
func Delete(linkTable *LinkTable) { //删除链表
linkTable.length = 0
linkTable.head = nil
}
删除值为data的结点:
func DeleteNode(linkTable *LinkTable, data int) *LinkTableNode { //删除第一个值为data的结点并返回
if linkTable.length == 0 {
return nil
}
if linkTable.length == 1 {
if linkTable.head.data == data {
Delete(linkTable)
return linkTable.head
} else {
return nil
}
}
var p = linkTable.head.next
var t = linkTable.head
for i := 0; i < linkTable.length-1; i++ {
if p.data == data {
t.next = p.next
p.next = nil
linkTable.length--
return p
}
t = p
p = p.next
}
return nil
}
4.查找操作
查找值为data的结点:
func Search(linkTable *LinkTable, data int) *LinkTableNode { //查找值为data的结点并返回
var p = linkTable.head
for i := 0; i < linkTable.length; i++ {
if p.data == data {
return p
}
p = p.next
}
return nil
}
5.插入操作
在值为data的结点后插入:
func InsertPost(linkTable *LinkTable, data1 int, data2 int) { //在值为data1的结点后面插入值为data2的结点
var p = linkTable.head
var node = new(LinkTableNode)
node.data = data2
for i := 0; i < linkTable.length; i++ {
if p.data == data1 {
node.next = p.next
p.next = node
linkTable.length++
return
}
p = p.next
}
}
在值为data的结点前插入:
func InsertPre(linkTable *LinkTable, data1 int, data2 int) bool { //在值为data1的结点前面插入值为data2的结点
var node = new(LinkTableNode)
node.data = data2
if linkTable.length == 1 {
if linkTable.head.data == data1 {
node.next = linkTable.head
linkTable.head = node
linkTable.length++
return true
} else {
return false
}
}
var p = linkTable.head.next
var t = linkTable.head
for i := 0; i < linkTable.length-1; i++ {
if p.data == data1 {
t.next = node
node.next = p
linkTable.length++
return true
}
t = p
p = p.next
}
return false
}
6.心得体会
对于链表的操作,因为定义的是不带头结点的链表,即第一个结点即为头结点,所以在针对链表进行操作的时候,在头结点处的操作与在其他结点处的操作不一致,需要分情况讨论,比较麻烦;由于只保存了头结点指针,因此创建链表时也不适合用尾插法进行创建。
7.代码地址
作者:291