-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathLinkListTest.go
More file actions
122 lines (112 loc) · 2.53 KB
/
LinkListTest.go
File metadata and controls
122 lines (112 loc) · 2.53 KB
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
package main
//Go语言基本操作练习
import "fmt"
type LinkList struct{
Data int32 //数据域
Next *LinkList //定义一个结构体类型指针
}//链表结构体
//Go语言 动态内存分配问题?
//头结点
type LinkHead struct{
HeadNode *LinkList
}
//Head指头结点. (好像要先声明一个该结构体类型的变量作为接受者)
func (Head *LinkHead)IsEmpty()(bool){
if Head.HeadNode==nil{
return true
} else {
return false
}
}
//返回链表长度(判断链表非空后)
func (Head *LinkHead) GetLength() int{
count:=0
NewNode:=Head.HeadNode//申请一个临时结点,其值为头结点的值
for NewNode!=nil{
count++
NewNode=NewNode.Next
}
return count
}
//头插函数
func (Head *LinkHead)InsertHead(value int32) {
NewNode:=&LinkList{Data:value}//申请一个新的结点,作为缓存
NewNode.Next=Head.HeadNode
Head.HeadNode= NewNode//把申请的新节点的值赋给Head
}
//指定位置index插入
func (Head *LinkHead)Insert(value int32,index int){
NewNode:=&LinkList{Data:value}
PresentNode:=Head.HeadNode
if index<=0{//
Head.InsertHead(value)
}else if index > Head.GetLength(){
Head.InsertEnd(value)
}else {
count:=0
for count< index-1{
PresentNode=PresentNode.Next
count++
}
//插入结点
PresentNode.Next=NewNode.Next
PresentNode.Next=NewNode
}
}
//尾插函数
func (Head *LinkHead)InsertEnd(value int32) {
NewNode := &LinkList{Data: value}
Node := Head.HeadNode //遍历用结点
if Node == nil { //头结点为空
Head.HeadNode = NewNode //直接把新节点赋给头结点
} else {
for Node.Next != nil {
Node = Node.Next
}//当Node.Next=nil,就是最后一个节点
Node.Next = NewNode
}
}
//指定位置删除节点
func (Head *LinkHead)Delete(index int){
count:=0 //计数器
Node:=Head.HeadNode
if index<=0{//索引小于0,就删除头结点
Head.HeadNode=Node.Next
}else if index<Head.GetLength(){
for count!=index-1&&Node.Next!=nil{
Node=Node.Next
count++
}
Node.Next=Node.Next.Next
}else if index>Head.GetLength(){
fmt.Print("超出链表长度")
}
}
//打印链表
func (Head *LinkHead)PrintList(){
if !Head.IsEmpty(){
Node:=Head.HeadNode
for{
fmt.Printf("\t%v",Node.Data)
if Node.Next!=nil{
Node=Node.Next
}else{
break
}
}
}
}
func main(){
linkList:=LinkHead{}
fmt.Println("Insert")
linkList.InsertHead(2)
linkList.InsertHead(4)
linkList.InsertHead(10)
linkList.InsertEnd(7)
linkList.InsertEnd(221)
linkList.PrintList()
fmt.Println(" ")
fmt.Println("Delete")
linkList.Delete(1)
linkList.PrintList()
}