go 语言链表的实现

学习一门语言,最重要的事情就是了解其数据类型以及数据结构,链表作为入门之经典,不可不知道。实现了链表,也就懂得了数据结构、指针的调用关系。具体地阐述数据类型、数据结构以及内存之间的关系,笔者会另划一个篇幅。这里只是链表的基本实现,算是共同学习的心得记录了。

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)
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值