VincentPass

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
统计
 

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

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

    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 }
复制代码

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

 

 

posted on   VincentPass  阅读(3035)  评论(2编辑  收藏  举报
(评论功能已被禁用)
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
 
点击右上角即可分享
微信分享提示