[数据结构与算法] 链表 II

一、理解指针或引用的含义

有些语言有“指针”的概念,比如 C 语言;有些语言没有指针,取而代之的是“引用”,比如 Java、Python。不管是“指针”还是“引用”,都是存储所指对象的内存地址。

将某个变量赋值给指针,实际上就是将这个变量的地址赋值给指针,或者反过来说,指针中存储了这个变量的内存地址,指向了这个变量,通过指针就能找到这个变量。

p->next = q;  // 表示p节点的后继指针存储了q节点的内存地址。
p->next = p->next->next;  // 表示p节点的后继指针存储了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,这会导致x节点的后继指针指向自身。因此,整个链表也就断成了两半,从结点 b 往后的所有结点都无法访问到了。对于有些语言来说,比如 C 语言,内存管理是由程序员负责的,如果没有手动释放结点对应的内存空间,就会产生内存泄露。

所以插入结点时,一定要注意操作的顺序,要先将结点 x 的 next 指针指向结点 b,再把结点 a 的 next 指针指向结点 x,这样才不会丢失指针,导致内存泄漏。如下所示:

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

    内存泄露:申请了内存空间进行使用,用完之后忘了归还,结果自己申请的那块内存空间最后自己也访问不到了(也有可能是把它的地址弄丢了),而系统也没办法把他分给需要的程序。
 
    内存溢出:1.要求分配的内存超出了系统能够给的,系统不能满足,于是就产生了溢出。2.或者申请int大小的内存,但是存放了long大小的数据,结果导致内存不够用,也会导致内存溢出。

再以删除一个节点举例。

删除 a节点 和 c节点 间的 b节点,b是a的下一节点,p指针指向节点a:

p—>next = p—>next—>next;

三、利用“哨兵”简化实现难度

​ 回顾一下单链表的插入和删除操作。如果在结点 p 后面插入一个新的结点,只需要下面两行代码就可以搞定。

new_node->next = p->next;
p->next = new_node;

但当要向一个空链表中插入第一个结点&

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值