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 }

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

  • 相关阅读:
    Java-1.2-上机
    java-1.2-homework
    java-1.1-上机
    java-1.1-hello world
    上菜!数据结构实验
    卡比兽Python类和对象
    Python最新答案
    关于专业任意选修课的看法——利用层次分析法教你做出最佳选课方案
    虎牙主播开始上线
    小破财App
  • 原文地址:https://www.cnblogs.com/BeyondAnyTime/p/2545652.html
Copyright © 2011-2022 走看看