美文网首页IT@程序员猿媛Go
Go语言之实现一个简单的单链表

Go语言之实现一个简单的单链表

作者: 有财君 | 来源:发表于2019-05-07 22:57 被阅读2次

1. 指针

我大学里第一门接触的编程课程是C语言,用了谭浩强的《C程序设计》第三版,其实用什么书都无所谓,反正我也没有学会C。

没有学会C,主要原因是C语言有一种叫做指针的东西,这种东西及其强大,可以直接操作内存。在学习Java之后,深入一点就需要了解到堆内存和栈内存的关系,其实也无非就是Java把指针帮我们实现了而已。

我记得C语言老师说过,指针很强大,也很难学,很多同学因为指针学不会也就再也学不会C语言了。很不幸,我就是那些学不会C语言的同学中的一员。

Go语言一样是可以使用指针的,那么下面看几个指针的例子:

package main

import (
    "fmt"
)

func main() {
    var p *int
    var i int = 1
    p = &i
    *p = 10
    //你猜这里输出的是什么?1还是10?
    fmt.Println(i)
}

最后的输出是10。在Java中,这样的代码输出是很不一样的:

public class Test {
    public static void main(String[] args) {
        Integer i = 1;
        Integer p = i;
        p = 10;

        System.out.println(i);
    }
}

输出一定是1,因为p实际上是一个堆内存中地址的指针。

p=10这一句其实是把指针的指向改了,本来呢,p指向的地方和i指向的地方一样,但是改了以后,指向的地方变化了,不过这个操作不影响i,所以打印的结果一定是1。

接着说Go语言的例子:

  • p是一个指针,一个int指针;
  • p指向了i的内存位置;
  • *p是取值的操作;
  • *p=10代表把指针p指向的内存中的值直接改成10

这一套操作下来,内存中的值被改变了,所以呢,i指向的值就变成了10,那么打印结果是10也就不足为奇了。

指针就是这么牛,能直接操作内存,不过好的一点是,我再也不用像C语言那样,自己malloc内存,还得负责回收了。

2. 单向链表

程序是数据结构加算法。

这句话虽然老套,但是到现在为止还是没有问题的。作为一个DBA,我最熟悉的数据结构莫过于B+树了,注意,B+树的叶子节点上有一个指针指向了相邻节点。

用指针实现数据结构,总是那么浑然天成。这让我又回忆起了我的大学生涯,我学的是严蔚敏的《数据结构》,里面的代码片段,他认识我我不认识他。各种指针指来指去,对我这种指针基本没学会的人来说,就是天书。

不过文字我还是看的懂的,通过结构体定义数据结构的一个一个节点,通过指针将这些节点连起来,就是一个个不同的数据结构了。

既然要学习Go语言,一点点的从0开始学太慢,不如挑战一点稍有难度的,然后有不会的就查资料,这样学起来比较快。后期熟练以后慢慢思考,应该能达到比较好的程度,至少Java我是这么学的。

先画个图:

单链表

单链表有一个头结点,只有一个指向下一个节点的指针,之后是普通的节点,蓝色的代表数据域,黄色的代表指针域,每个指针域都指向下一个节点。

想到节点,就是那么自然的想到了结构体:

typedef struct node {
    int data;
    struct node *next;
} LinkedList;

如果是头结点只有一个*next即可。

C语言能如此,Go也可以,而且两者的语法是如此的相似:

type Node struct {
    data int
    next *Node
}

有了结构体这个武器之后,就可以开始写单向链表了。上面已经实现了节点的定义,那么下面要实现的就是链表的定义了:

type LinkedList struct {
    head *Node
}

今天首先看看怎么新建一个链表,其实总共有两步:

  • 创建一个头结点,next域为nil;
  • 创建一个LinkedList结构体变量,把头结点丢给它。
//为了代码的优雅,只提供一个新建node的方法
//新建头结点,无非是将参数变成nil和nil
func NewNode(data int, next *Node) *Node {
    return &Node{data, next}
}

func NewLinkedList(node *Node) *LinkedList {
    return &LinkedList{node}
}

3. 小结

初学者写一个Go实现的链表还是有难度的,起码今天我就参考了不少资料,毕竟指针也是学了个皮毛。

接下来会认认真真的写的。

要是当年我脑筋想现在这么清楚,为什么学不会C语言呢?Go要是能学到参与工程的水平,我就开始学C。

正所谓,学而不思则罔,思而不学则殆。

相关文章

  • 线性表之单链表实现

    线性表之单链表实现 实现单链表的初始化、插入、删除等基本运算 实现单链表的输入、输出运算 实现单链表的逆置、归并、...

  • Go语言之实现一个简单的单链表

    1. 指针 我大学里第一门接触的编程课程是C语言,用了谭浩强的《C程序设计》第三版,其实用什么书都无所谓,反正我也...

  • 001 go 语言实现单链表

    1 单链表的定义 代码仓库https://gitee.com/babyb/data_srtuct 引用百度百科:h...

  • 单链表的C语言算法实现

    单链表的C语言算法实现 自己用C语言实现的单链表算法,有什么不正确的地方,请各位共同讨论与指正。

  • GO 模拟单链表代码简单实现

    概念: 链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象) + 指针(指示后继元素存储位置),元...

  • go语言container包中的那些容器

    go语言container包中的那些容器 主要内容 List和Element。前者实现了一个双向链表(以下简称链表...

  • 25_静态单链表的实现

    关键词: 单链表的一个缺点、静态单链表设计思路、静态单链表的继承层次结构、静态单链表的实现思路、静态单链表的实现 ...

  • 单链表的Go实现

    单链表是最简单的数据结构之一,它也是许多高级数据结构的基础,所以十分重要。将熟悉的数据结构用新编程语言重新实现一次...

  • Java实现简单的链表-面向初学者

    很久之前用C语言实现过链表,现在已经太久没用C语言。就先用JAVA实现一个简单链表好了,还是使用最原始的C语言实现...

  • 数据结构 — 静态链表

    单链表的相对劣势 单链表的实现严重依赖指针 数据元素中必须包含一个额外的指针域 没有指针的程序设计语言无法实现 静...

网友评论

    本文标题:Go语言之实现一个简单的单链表

    本文链接:https://www.haomeiwen.com/subject/dauuoqtx.html