zoukankan      html  css  js  c++  java
  • 7、链表(下):如何轻松写出正确的链表代码?

    很汗颜,现在让自己完整的写出一个简单的链表结构竟然会无法动笔,作为一个程序猿,需要修行的路还很长。

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

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

    例子: p->next = q。这行代码的意思是p节点的next指针存储了q节点的内存地址。

            同理, p->next = p->next->next。这行代码的意思是p节点的next指针存储了p节点的下下一个节点的地址。

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

    举例插入节点:

    如图所示,我们希望在节点a和b之间插入节点x,假设当前指针p指向节点a。如果代码如下就会发生指针丢失和内存泄漏。

    p->next = x;
    x->next = p->next; 

    此处在p->next执行之后,其指针就不再指向b了,而是指向x。第二行代码就相当于自己指向了自己。因此,链表断成了两半,从节点b往后的所有界定啊都无法访问。

    正确方式:将第一行代码和第二行代码颠倒顺序,就ok了。

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

    如下,节点p之后插入节点的正确代码。

    x->next = p->next;
    p->next = x;

    注意:当需要向一个空链表中插入第一个节点,上面的逻辑就不能用了。正确答案如下:

    if(head==null){
        head = new_node;
    }

    同理,在编写链表的删除操作之时,分为两种情况:

    第一种,删除节点不是尾节点,而是p节点的后继结点

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

    第二种,删除结点是尾结点

    if(node->next == null){
       head = null;  
    }

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

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

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

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

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

    技巧五:自己画图,辅助记忆

    常见的链表操作:

    一、单链表反转

    二、链表中环的检测

    三、两个有序的链表的合并

    四、删除链表倒数第n个结点

    五、求链表的中间结点

    分别对应LeetCode练习题编号:206,141,21,19,876。

    课后思考:你是否能想到其他场景,利用哨兵可以大大简化编码难度?

    后续把自己实现的五种链表操作传上来。欢迎指正!

  • 相关阅读:
    C++闭包到C函数指针转化
    是否使用预编译头文件
    多线程模型一:只完成最新任务
    关于“函数针对入参判空并返回”
    C++函数参数的编写
    .Net Core(二) 下
    微信接口本地调试(IIS服务器)
    .Net Core 学习(二)上篇
    .Net Core学习(一)
    博客园的第一个博客
  • 原文地址:https://www.cnblogs.com/CherishZeng/p/9787165.html
Copyright © 2011-2022 走看看