由一道数据结构题目想到的

来源:互联网 发布:勇往直前网络歌手歌词 编辑:程序博客网 时间:2024/05/22 00:38

这题目是:已知指向单链表中段某结点的指针p,在不遍历链表的前提下删除当前结点。


我们都知道,对于单链表这样的存在,必须在知道前驱地址的前提下才好删去当前结点。这就要求从头遍历链表,找到next指向当前结点的结点,然后让它的next跨过当前节点即可。


但是不让遍历怎么办呢?在看了答案之后,我的情绪遭遇了一次小小的震荡。我把注意力收缩在封装了数据和指针的结点结构上——这已经是多年的思维定势。但是答案告诉我,不是要删除当前结点么,不是不能遍历么?那好,我把下一个结点的数据域的值拷贝给当前结点,然后把下一个结点删掉即可。。。删掉即可。。。即可。。。可:

p.data = p.next.data;p.next = p.next.next;

两行代码解决战斗。好吧,我被玩儿了。也许有人要跟我一样从心底呐喊:投机!投机又怎样?我们的目的是解决问题不是装逼。

删结点也不是杀人,你要杀A,结果找不到A,于是把B的户口改成A然后杀掉——这是荒唐的。但是对于程序来说,这个思维是有效的。

而且本质的来看,这个处理完全符合单链表删除结点算法的规律:找到前驱,让它跟后继结点对接,扔掉当前结点完事儿。同时,删除节点这个问题的本质还是删除其中的数据,而非一定要收回被占据的某特定地址的存储空间。

感谢这个问题,至少以后我会警醒自己不要把思路收得太狭窄。




原创粉丝点击