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

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。

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值