鱼C论坛

 找回密码
 立即注册
查看: 2823|回复: 12

单向链表删除节点怎么获得上一个节点

[复制链接]
发表于 2019-5-31 13:00:54 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. public class Node{
  2.     private Object obj;
  3.     private Node next;
  4. }
复制代码

现有ABCDE 5个节点,分别指向下一个节点:A->B->C->D->E
比如我想删除C,就得做类似的操作

  1. B.next = B.next.next;
  2. C.next = null;
复制代码


假如我迭代到了 C 节点
怎么获得 B 节点?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-5-31 13:54:08 | 显示全部楼层
有一种不需要B节点的方法:通过C拿到D节点,再将D节点的所有值覆盖到C节点。最后让D节点的next为null。但是如果节点中的内容比较多,覆盖过程就比较繁琐。。。。。
就像这样C.a = D.a; C.b = D.b;C.c = D.c;.......................................C.next = D.next; D.next = null;
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-5-31 14:34:54 From FishC Mobile | 显示全部楼层
本帖最后由 jackz007 于 2019-5-31 14:39 编辑

        没有任何办法,对于单向链表来说,最要紧的就是在任何情况下都不能把首节点弄丢!否则的话,可以考虑双向链表,或者闭环链表(首尾相连的单向链表)。这样的话,只要有任何的一个节点在握,就可以遍历整个链表。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-5-31 15:16:19 | 显示全部楼层
jackz007 发表于 2019-5-31 14:34
没有任何办法,对于单向链表来说,最要紧的就是在任何情况下都不能把首节点弄丢!否则的话,可以考 ...

那一般删除单向链表中的某一个节点时,是怎么做的?该不会是用下一节点覆盖吧。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-5-31 15:38:54 From FishC Mobile | 显示全部楼层
    当然是得找到它的前一个节点。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-5-31 16:24:58 | 显示全部楼层
jackz007 发表于 2019-5-31 15:38
当然是得找到它的前一个节点。

。。。。我就是问怎么得到前一个节点。。。就像我的问题那样,假如我得到了C节点,怎么拿到B节点。。
大佬你之前不是说:没有任何办法嘛。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-5-31 16:32:29 From FishC Mobile | 显示全部楼层
本帖最后由 jackz007 于 2019-5-31 16:33 编辑

      是啊,你得从头节点开始逐节点向后摸,当下一个节点就是 C 的时候,B 节点就算是找到了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-5-31 17:03:13 | 显示全部楼层
从头结点开始,一个一个往下找,指向C数据域的就是B节点了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-5-31 17:29:42 | 显示全部楼层
jackz007 发表于 2019-5-31 16:32
是啊,你得从头节点开始逐节点向后摸,当下一个节点就是 C 的时候,B 节点就算是找到了。

我还是直接贴的例子吧
  1. public void remove(Object e) {//假如 e 是节点C中的值
  2.                 Node temp = first;//这是首节点
  3.                 while(temp.next != null) {
  4.                         if(temp.element.equals(e)) {//按照你的说法这里难道写temp.next.element.equals(e)
  5.                                 //这里怎么拿到上一个节点?
  6.                                //假设这里temp就是C节点,怎么把C删除了?

  7.                         }                                               
  8.                         temp = temp.next;
  9.                 }
  10.         }
复制代码


感觉如果这样写:temp.next = temp.next.next;太容易空指针了。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-5-31 17:55:56 From FishC Mobile | 显示全部楼层
本帖最后由 jackz007 于 2019-5-31 18:02 编辑

                if first . element . equals(e) {
                        temp = first ;
                        first = first . next ;
                        break ;
                } else {
                        if temp . next . element . equals(e) {
                                temp . next = temp . next . next ;
                                temp = temp . next ;
                                break ;
                        }
                }
        }
. . . . . .
        free(temp) ;
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-5-31 18:50:59 | 显示全部楼层
jackz007 发表于 2019-5-31 17:55
if first . element . equals(e) {
                        temp = first ;
           ...

。。。。你认真的吗。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-5-31 20:05:27 From FishC Mobile | 显示全部楼层
      难道有什么问题?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-7-19 22:40:31 | 显示全部楼层
用双指针
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-11 16:57

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表