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

137 阅读2分钟

基本概念

  • 链表的操作:链表反转、有序链表合并等\

  • 学习的方法:多练+多总结

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

  • 语言中的指针

    • c语言的指针
    • Java的引用
  • 什么是指针

    • 将某个变量赋值给指针,实际上就是将这个变量的地址赋值给指针
    • 指针指向变量地址(000ffff)
    • 通过指针可以找到变量(int(001ffff-000ffff))
  • 举个例子

    • p→next=q:p 结点中的 next 指针存储了 q 结点的内存地址\

    • p->next=p->next->next:p 结点的 next 指针存储了 p 结点的下下一个结点的内存地址

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

  • 什么情况会指针丢失

    • 删除操作是否,操作指针的顺序错误,会导致指针循环\

    • 对于c语言需要手动释放内存\

\

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

  • 为什么是哨兵

    • 大部分的链表操作都可以利用
    • 针对链表的插入、删除操作,需要对插入第一个结点和删除最后一个结点的情况进行特殊处理\
  • 有哨兵的是带头链表

  • 可能用到的地方:插入排序、归并排序、动态规划\

\

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

  • 检查链表的边界

    • 如果链表为空时,代码是否能正常工作?\

    • 如果链表只包含一个结点时,代码是否能正常工作?\

    • 如果链表只包含两个结点时,代码是否能正常工作?\

    • 代码逻辑在处理头结点和尾结点的时候,是否能正常工作?

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

  • 举例法和画图法\

\

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

  • 单链表反转
  • 链表中环的检测
  • 两个有序的链表合并
  • 删除链表倒数第 n 个结点  双指针(判断边界问题,哨兵、、、)
  • 求链表的中间结点 双指针\

总结

  • 链表的正确使用方式

    • 理解指针或引用的含义\

    • 警惕指针丢失\

    • 内存泄漏\

    • 利用哨兵简化实现难度\

    • 重点留意边界条件处理\

  • 写链表代码是最考验逻辑思维能力的