现在的位置: 首页 > 综合 > 正文

巧妙删除无头单链表中的节点(算法中的“狸猫换太子”)

2012年04月22日 ⁄ 综合 ⁄ 共 882字 ⁄ 字号 评论关闭

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

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

    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 }

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

 

 

抱歉!评论已关闭.