强人♂锁男 发表于 2019-5-31 13:00:54

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

public class Node{
    private Object obj;
    private Node next;
}
现有ABCDE 5个节点,分别指向下一个节点:A->B->C->D->E
比如我想删除C,就得做类似的操作

B.next = B.next.next;
C.next = null;

假如我迭代到了 C 节点
怎么获得 B 节点?

强人♂锁男 发表于 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;

jackz007 发表于 2019-5-31 14:34:54

本帖最后由 jackz007 于 2019-5-31 14:39 编辑

      没有任何办法,对于单向链表来说,最要紧的就是在任何情况下都不能把首节点弄丢!否则的话,可以考虑双向链表,或者闭环链表(首尾相连的单向链表)。这样的话,只要有任何的一个节点在握,就可以遍历整个链表。

强人♂锁男 发表于 2019-5-31 15:16:19

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

那一般删除单向链表中的某一个节点时,是怎么做的?该不会是用下一节点覆盖吧。。

jackz007 发表于 2019-5-31 15:38:54

    当然是得找到它的前一个节点。

强人♂锁男 发表于 2019-5-31 16:24:58

jackz007 发表于 2019-5-31 15:38
当然是得找到它的前一个节点。

。。。。我就是问怎么得到前一个节点。。。就像我的问题那样,假如我得到了C节点,怎么拿到B节点。。
大佬你之前不是说:没有任何办法嘛。。。

jackz007 发表于 2019-5-31 16:32:29

本帖最后由 jackz007 于 2019-5-31 16:33 编辑

      是啊,你得从头节点开始逐节点向后摸,当下一个节点就是 C 的时候,B 节点就算是找到了。

不要用我名嗷 发表于 2019-5-31 17:03:13

从头结点开始,一个一个往下找,指向C数据域的就是B节点了

强人♂锁男 发表于 2019-5-31 17:29:42

jackz007 发表于 2019-5-31 16:32
是啊,你得从头节点开始逐节点向后摸,当下一个节点就是 C 的时候,B 节点就算是找到了。

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

                        }                                               
                        temp = temp.next;
                }
        }

感觉如果这样写:temp.next = temp.next.next;太容易空指针了。。

jackz007 发表于 2019-5-31 17:55:56

本帖最后由 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) ;

强人♂锁男 发表于 2019-5-31 18:50:59

jackz007 发表于 2019-5-31 17:55
if first . element . equals(e) {
                        temp = first ;
         ...

。。。。你认真的吗。。。{:10_277:}

jackz007 发表于 2019-5-31 20:05:27

      难道有什么问题?

SYCh 发表于 2019-7-19 22:40:31

用双指针
页: [1]
查看完整版本: 单向链表删除节点怎么获得上一个节点