GO语言 链表(单向链表

server/2025/2/2 10:51:23/

链表的前提

GO语言的链表类似于C语言的链表,它通过结构体和结构体指针实现。

结构体

GO语言定义结构体如下
 

type user struct {name stringage  intnext *user
}
结构体指针

结构体指针就是指向结构体的指针,我们在链表中会用到结构体指针实现链表节点之间的连接
next *user   就是结构体指针

构建链表

构建链表需要三点:头节点,尾节点,中间节点
头节点的作用相当于链表的入口,尾节点用来表示节点的结尾,中间节点用于存储信息

创建头节点
 

head := &user{}
//此时的head 类型是*user

插入节点


1.尾插法
func insert_end(head *user, name string, age int) *user {new_user := &user{name, age, nil}p := headfor {if p.next != nil {p = p.next}break} //循环结束后p指向最后一个节点p.next = new_userreturn head
}

为什么new_user := &user{name, age, nil}创建一个结构体指针 而不是创建一个结构体变量

如果我们直接创建一个结构体变量,那它的类型就是user,由因为我们是在insert_end函数里面创建的这个变量,所以它的生命周期只有在这个函数里面存在。并且我们在接入节点的时候p.next = new_user就会报错,我们就需要改成p.next = &new_user。但是当我们的函数结束的时候new_user 就会被销毁,p.next就会指向一个已经被销毁的内存。但是我们使用new_user := &user{name, age, nil}的时候虽然user会随着函数结束而销毁但是这个内存由于被链表引用所以会一直存在。

尾插法的核心点在于寻找尾节点,并让尾节点的next指向新节点

2.头插法
func insert_head(head *user, name string, age int) *user {p := head.nextnew_user := &user{name, age, nil}head.next = new_usernew_user.next = preturn head
}

最后返回head是保证外部的head结构正确。我们在insert_head函数里面的head并不是main函数里面的head,他只是一个副本,我们需要副本覆盖掉原来的。所以需要return head(副本)

3.中插法(指定插入到某个节点之前)

func insert_body(head *user, name string, age int, key string) *user {new_user := &user{name, age, nil}p := headp2 := head.nextfor p2 != nil {if p2.name == key {p.next = new_usernew_user.next = p2return head}p = p2p2 = p2.next}// 如果循环结束都没有找到,则输出错误信息fmt.Println("插入错误,没找到对应的节点")return head
}

在这个方法中我们需要确定当前节点的下一个节点是否是我们需要插入到它之前的节点。如果是的话就让当前节点的next指向新节点,新节点的next指向原下一节点。

链表的删除

func delete(head *user, key string) *user {p := headp2 := head.nextfor p2 != nil {if p2.name == key {p.next = p2.next}p = p2p2 = p2.next}return head
}

删除的主要点在于让上一节点直接指向被删除节点的next,掠过这个节点。被删除节点由于无人引用就会自动回收

链表的遍历

func bianli(head *user) {p := head.nextfor {if p != nil {fmt.Println(p.name, p.age)} else {break}p = p.next}
}

遍历只需要一个头节点,不断循环下去一直循环到nil为止,然后输出对应节点的信息


http://www.ppmy.cn/server/164312.html

相关文章

《Ollama与DeepSeek》

《Ollama与DeepSeek》 启动并运行大型语言模型。 macOS 的 下载 窗户 下载 Linux的 <span style"background-color:var(--bgColor-muted, var(--color-canvas-subtle))"><span style"color:#1f2328"><span style"color:var(--fgColor-…

hive为什么建表,表存储什么

‌Hive建表的主要目的是为了方便管理和查询存储在Hadoop分布式文件系统&#xff08;HDFS&#xff09;上的大规模数据。‌ Hive作为一个构建在Hadoop之上的数据仓库工具&#xff0c;主要功能是提供类似SQL的查询语言HiveQL来处理和分析存储在HDFS中的数据。通过建表&#xff0c;…

控件【QT】

文章目录 控件QWidgetenabledgeometrysetGeometry qrcwindowOpacityQPixmapfonttoolTipfocusPolicystyleSheetQPushButtonRadio ButtionCheck Box显示类控件 控件 Qt中已经提供了很多内置的控件了(按钮,文本框,单选按钮,复选按钮&#xff0c;下拉框…&#xff09; Qt中的各种…

1905电影网中国地区电影数据分析(二) - 数据分析与可视化

文章目录 前言一、数据分析1. 数据分析代码实现2. 分析后的数据截图2.1 描述性分析结果数据2.2 类别分布分析结果数据2.3 模式识别分析结果数据2.4 时间序列分析结果数据2.4.1 每年的电影发布数量2.4.2 按年份的评分趋势 2.5 相关性分析结果数据 二、数据可视化1. 描述性分析数…

微前端架构在前端开发中的实践与挑战

随着单页面应用&#xff08;SPA&#xff09;和前端框架如 React、Vue、Angular 的快速发展&#xff0c;现代前端应用的复杂度日益提升。尤其是当应用规模逐渐增大时&#xff0c;单一的代码库往往难以应对不同团队的协作和版本管理问题。为了应对这一挑战&#xff0c;微前端架构…

CF 764B.Timofey and cubes(Java实现)

题目分析 输入n个数字&#xff0c;首尾交换&#xff0c;奇数对换&#xff0c;偶数对不换 思路分析 存入数组&#xff0c;遍历时判断i%20时(数组下标0开始&#xff0c;所以题目分析没有错)&#xff0c;对换 代码 import java.util.*;public class Main {public static void ma…

HTML<kbd>标签

例子 在文档中将一些文本定义为键盘输入&#xff1a; <p>Press <kbd>Ctrl</kbd> <kbd>C</kbd> to copy text (Windows).</p> <p>Press <kbd>Cmd</kbd> <kbd>C</kbd> to copy text (Mac OS).</p>…

Python-基于PyQt5,pdf2docx,pathlib的PDF转Word工具

前言:日常生活中,我们常常会跟WPS Office打交道。作表格,写报告,写PPT......可以说,我们的生活已经离不开WPS Office了。与此同时,我们在这个过程中也会遇到各种各样的技术阻碍,例如部分软件的PDF转Word需要收取额外费用等。那么,可不可以自己开发一个小工具来实现PDF转…