zoukankan      html  css  js  c++  java
  • 巧妙删除无头单链表中的节点(算法中的“狸猫换太子”)

      最近看书看到了这样一个问题:“删除无头单链表中的某个节点”。如果没有“无头”这个前提,那么这个问题应该不算是个问题了吧。这让我想到了一句话,那就是“在企业中塑造不可替代性”,如果一个技能大家都会,那么这绝对不是你的特长,只有这个问题你会,那些人儿不会,那你才牛嘛,所以我们要会就会这种无头单链表的删除操作。可能有些人儿说了,那么这样一写出来,大家不就都会了吗?我个人却不是这样想的,学点东西还怕人知道吗,一个人要想真正有实力,靠的是不断的学习,而不是学点东西怕人知道藏起来(个人观点哦)。作为一个将要走出校门的大三学生,一直在努力提高自身的技能,希望在毕业的时候找到满意的工作。好了,进入正题吧。

      问题的具体情况是这样的,该单链表没有头结点,只有一个指针指向此单链表的中间的一个节点(不是第一个结点,也不是最后一个节点),请将该节点从单链表中删除。假设存在一个这样的链表:

        A -> B -> C -> D

    现在,有一个指针pCurrent指向节点B(要删除的节点),要删除节点B,只需要让节点A->next 指向节点C,这样就完成了删除,但是注意哦,这里的A节点实际上是没有办法获得的,那么该怎么办呢?看到这里,关键的部分就来了,现在让我们来上演一出算法版的“狸猫换太子”,具体做法分为下面几步:

    1.B->data = C -> data;

    2.B->next = C->next;

    3.delete C;

    实际上这样完成删除的,令节点B的数据为节点C的数据,然后删除C,这样就一种非常巧妙的方法完成了节点B的删除。

    还是给一个代码:

     1 void DeleteNode(node *pCurr)
     2 {
     3      Assert(pCurr != NULL);
     4      node * pNext = pCurr->next;
     5      if(pNext != NULL)
     6      {
     7            pCurr->next = pNext->next;
     8            pCurr->data = pNex->data;
     9            delete pNext;
    10      }
    11 }

    注意代码中的是否为空检查是非常有必要的,这考察了程序员编程风格和思维的缜密程度。最初看到这个“狸猫换太子”算法的时候有点小兴奋哦。

  • 相关阅读:
    希望走过的路成为未来的基石
    第三次个人作业--用例图设计
    第二次结对作业
    第一次结对作业
    第二次个人编程作业
    第一次个人编程作业(更新至2020.02.07)
    Springboot vue 前后分离 跨域 Activiti6 工作流 集成代码生成器 shiro权限
    springcloud 项目源码 微服务 分布式 Activiti6 工作流 vue.js html 跨域 前后分离
    spring cloud springboot 框架源码 activiti工作流 前后分离 集成代码生成器
    java代码生成器 快速开发平台 二次开发 外包项目利器 springmvc SSM后台框架源码
  • 原文地址:https://www.cnblogs.com/BeyondAnyTime/p/2545652.html
Copyright © 2011-2022 走看看