• 【数据结构】单向链表进阶小技巧


     给你这样一个链表,你如何在3节点前插入一个节点并且不遍历这个链表。

    你如何在把3节点删除不遍历这个链表。

     一、不遍历插入节点

    给出思路,在3节点后面插入一个节点:

    并将其赋予3节点的值:

     最后将三节点的值改为要插入的值:

    大功告成,贴上代码:

    1. void SListInsertBefore(SLTNode* pos,SLTDataType x)
    2. {
    3. assert(pos);
    4. SLTNode *newnode=(SLTNode *)malloc(sizeof(SLTNode));
    5. newnode->data = pos->data;
    6. newnode->next = pos->next;
    7. pos->next = newnode;
    8. }

     二、不遍历删除一个节点

    上思路:先把4节点的值赋予3节点。

     然后将3节点的next指向4节点的下一个。

     最后再将4节点销毁。

    上代码:

    1. void SListErasePos(SLTNode* pos)
    2. {
    3. assert(pos&&pos->next);
    4. SLTNode* next = pos->next;
    5. pos->data = next->data;
    6. pos->next = pos->next->next;
    7. free(next);
    8. next = NULL;//养成好习惯,吧malloc的空间释放掉
    9. }

    这个方法还是有一个缺陷,就是pos不能指向最后一个节点。而上一个方法就没有这个烦恼。

    对于这些方法也不用太纠结,因为日常使用中双向链表才是最实用的。

    三、单向链表的头标兵

    我们用纯c语言写链表在头删头插的地方经常会应用到二级指针,这里有一个更合理的处理方式:

    加上一个头标兵头结点,且头节点不存放任何数据

    这个有多舒服,就比如头插的时候直接在头结点后加一个节点就行了也不用判断是否为空节点,头删的时候直接让头结点指向2号节点。

  • 相关阅读:
    电脑网速慢怎么解决?推荐这3个方法
    Arch Linux安装桌面环境
    Spark文章汇总
    Linux--exec族函数及与fork共用
    【Linux】动态库&静态库
    Java学习之多线程
    【【萌新的STM32的学习--非正点原子视频的中断设计思路】】
    我终于把前后端项目部署到服务器了
    知识图谱推理研究综述9.3
    yocto(六)——搭建yocto环境
  • 原文地址:https://blog.csdn.net/qq_64484137/article/details/126281891