学习一门语言,最重要的事情就是了解其数据类型以及数据结构,链表作为入门之经典,不可不知道。实现了链表,也就懂得了数据结构、指针的调用关系。具体地阐述数据类型、数据结构以及内存之间的关系,笔者会另划一个篇幅。这里只是链表的基本实现,算是共同学习的心得记录了。
package main
import "fmt"
type Node struct {
// 值
Data interface{}
// 后继节点指针
Next *Node
}
// 链表是否为空
func IsEmpty(node *Node) bool {
return node == nil
}
// 是否是最后一个节点
func IsLast(node *Node) bool {
return node.Next == nil
}
// 查找前驱节点
func FindPrevious(index int, list *Node) *Node{
temp := list
if index == 0{
return temp
}
for i:=0;i<index-1;i++{
temp = temp.Next
}
return temp
}
// 插入节点
func InsertList(index int,list *Node,data int) {
temp := list
if index == 0{
temp.Data = data
return
}
if index <0{
fmt.Println("索引不合法")
return
}
// 查找当前索引位置
for i := 0;i<index;i++{
if IsEmpty(temp){
fmt.Println("索引越界")
return
}
temp = temp.Next
}
// 创建新节点
newNode :=Node{Data: data}
// 新节点的Next指针指向当前位置
newNode.Next = temp
// 查找前驱节点
pre := FindPrevious(index,list)
// 前驱节点的Next指针指向新节点
pre.Next = &newNode
}
// 删除节点
func DeleteNode(index int,list *Node) {
temp := list
if index == 0{
return
}
// 查找当前索引位置
for i := 0;i<index;i++{
temp = temp.Next
}
// 查找前驱节点
pre := FindPrevious(index,list)
// 前驱节点的Next指针指向后驱节点即可删除当前
pre.Next = temp.Next
}
// 末尾添加节点
func Append(list *Node,node *Node) {
for list != nil {
temp := list.Next
if temp == nil{
list.Next = node
break
}
list = list.Next
}
}
// 打印所有的List
func PrintList(list *Node) {
temp := list
for temp != nil {
fmt.Println(temp.Data)
temp = temp.Next
}
}
func main() {
// 创建头节点
headNode := &Node{
Data: 0,
Next: nil,
}
node1 := &Node{
Data: 1,
}
node2 := &Node{
Data: 2,
}
Append(headNode,node1)
Append(headNode,node2)
InsertList(1,headNode,10)
DeleteNode(3,headNode)
PrintList(headNode)
}