链表(下):如何轻松写出正确的链表代码?.pdf

链表(下):如何轻松写出正确的链表代码?.pdf

  1. 1、本文档共8页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多

08|链表(下):如何轻松写出正确的

链表代码?

上一节我讲了链表相关的基础知识。学完之后,我看到有人留言说,基础知识

我都掌握了,但是写链表代码还是很费劲。哈哈,的确是这样的!

想要写好链表代码并不是容易的事儿,尤其是那些复杂的链表操作,比如链表

反转、有序链表合并等,写的时候非常容易出错。从我上百场面试的经验来

看,能把“链表反转”这几行代码写对的人不足10%。

为什么链表代码这么难写?究竟怎样才能比较轻松地写出正确的链表代码呢?

只要愿意投入时间,我觉得大多数人都是可以学会的。比如说,如果你真的能

花上一个周末或者一整天的时间,就去写链表反转这一个代码,多写几遍,一

直练到能毫不费力地写出Bugfree的代码。这个坎还会很难跨吗?

当然,自己有决心并且付出精力是成功的先决条件,除此之外,我们还需要一

些方法和技巧。我根据自己的学习经历和工作经验,总结了几个写链表代码技

巧。如果你能熟练掌握这几个技巧,加上你的主动和坚持,轻松拿下链表代码

完全没有问题。

技巧一:理解指针或引用的含义

事实上,看懂链表的结构并不是很难,但是一旦把它和指针混在一起,就很容

易让人摸不着头脑。所以,要想写对链表代码,首先就要理解好指针。

我们知道,有些语言有“指针”的概念,比如C语言;有些语言没有指针,取而

代之的是“引用”,比如Java、Python。不管是“指针”还是“引用”,实际上,它

们的意思都是一样的,都是存储所指对象的内存地址。

接下来,我会拿C语言中的“指针”来讲解,如果你用的是Java或者其他没有

指针的语言也没关系,你把它理解成“引用”就可以了。

实际上,对于指针的理解,你只需要记住下面这句话就可以了:

将某个变量赋值给指针,实际上就是将这个变量的地址赋值给指针,或者反过

来说,指针中存储了这个变量的内存地址,指向了这个变量,通过指针就能找

到这个变量。

这句话听起来还挺拗口的,你可以先记住。我们回到链表代码的编写过程中,

我来慢慢给你解释。

1

在编写链表代码的时候,我们经常会有这样的代码:p-next=q。这行代码是

说,p结点中的next指针存储了q结点的内存地址。

还有一个更复杂的,也是我们写链表代码经常会用到的:

p-next=p-next-next。这行代码表示,p结点的next指针存储了p结点

的下下一个结点的内存地址。

掌握了指针或引用的概念,你应该可以很轻松地看懂链表代码。恭喜你,已经

离写出链表代码近了一步!

技巧二:警惕指针丢失和内存泄漏

不知道你有没有这样的感觉,写链表代码的时候,指针指来指去,一会儿就不

知道指到哪里了。所以,我们在写的时候,一定注意不要弄丢了指针。

指针往往都是怎么弄丢的呢?我拿单链表的插入操作为例来给你分析一下。

如图所示,我们希望在结点a和相邻的结点b之间插入结点x,假设当前指

针p指向结点a。如果我们将代码实现变成下面这个样子,就会发生指针丢

失和内存泄露。

p-next=x;//将p的next指针指向x结点;

x-next=p-next;//将x的结点的next指针指向b结点;

复制代码

初学者经常会在这儿犯错。p-next指针在完成第一步操作之后,已经不再指

向结点b了,而是指向结点x。第2行代码相当于将x赋值给x-next,自

2

己指向自己。因此,整个链表也就断成了两半,从结点b往后的所有结点都无

法访问到了。

对于有些语言来说,比如C语言,内存管理是由程序员负责的,如果没有手

动释放结点对应的内存空间,就会产生内存泄露。所以,我们插入结点时,一

定要注意操作的顺序,要先将结点x的next指针指向结点b,再把结点a

的next指针指向结点x,这样才不会丢失指针,导致内存泄漏。所以,对于

刚刚的插入代码,我们只需要把第1行和第2行代码的顺序颠倒一下就可以

了。

同理,删除链表结点时,也一定要记得手动释放内存空间,否则,也会出现内

存泄漏的问题。当然,对于像Java这种虚拟机自动管理内存的编程语言来

说,就不需要考虑这么多了。

技巧三:利用哨兵简化实

文档评论(0)

yzs890305 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档