第七节-链表下

2018-10-05  本文已影响27人  wean_a23e

这节课主要讲了如何轻松正确地写出正确地链表代码

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

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

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

写链表时,一定要注意指针指向哪了,对于脑子转不过来的情况,可以在纸上画图辅助思考。
对于自己管理内存的语言,如 C 语言,如果没有手动释放节点对应的内存空间,就会产生内存泄漏。不过,对于 Java 这种虚拟机自动管理内存的编程语言来说,就不需要考虑那么多了。

技巧三:利用哨兵简化实现难度

有时代码写不出来,也是因为代码的小逻辑多而乱,如果能够实现分析代码,简化逻辑,那么写起代码来就会更容易轻松了。
比如,当在单链表插入一个新节点时,需要两个小逻辑:1. 链表是空的的情况 2. 链表不是空的情况 写起来的代码就会像这样复杂
而如果我们有一个哨兵节点,那么就只需“无脑”往这个节点后面插入新节点而不用进行一次判空特殊处理了。

拓展:在很多算法中都有用到哨兵做简化,比如插入排序、归并排序、动态规划等。
下面这个例子就是用了哨兵提升性能:

inf find(char* a, int n, int key) {
  if (a[n-1] == key) {
    return n-1;
  }
  char tmp = a[n-1];
  a[n-1] = key;
  int i = 0;
  while (a[i] != key) {
    ++i;
  }
  a[n-1] = tmp;
  if (i == n-1) return -1;
  return i;
}

技巧四:重点留意边界条件处理

软件开发中,我们往往是从“通常情况入手,设计代码”,这种情况下,如果不注意特殊情况(边界情况)时,就容易产生 BUG。一定要在写完代码后,检查边界条件是否考虑齐全。
常用来检查链表代码是否正确的边界条件有这样几个:

技巧五:画图举例,辅助思考

感觉这也是软件设计图的细节版。写出来,整理一下,就明白了。

技巧六:多写多练,没有捷径

水滴石穿,时刻铭记。

上一篇下一篇

猜你喜欢

热点阅读