单向链表删除中间某个节点

ZXCV
  • 10
                //这种写法感觉和下面没什么区别啊,只是将temp.next 赋给了 deleteNode  而已
                if(key.equals(temp.next.key)) {
                //假设temp.next 是要删除的节点
                    Node deleteNode = temp.next;                    
                    temp.next = deNode.next;                                        
                    deNode.next = null;    
                }  
                
                //为什么这种写法会将(temp.next)节点 和 (temp.next.next节点后面) 的所有的节点全部删除了
                if(key.equals(temp.next.key)) {
                //假设temp.next 是要删除的节点                    
                    temp.next = temp.next.next;                                        
                    temp.next.next = null;    

                }
回复
阅读 2.4k
2 个回答
✓ 已被采纳

第二个写法,因为你temp.next = temp.next.next; 这句已经把temp.next改变了,已经不指向要删除的节点,此时你temp.next.next = null不是把被删除节点的next清除,而是把后面的节点全部删除。

if(key.equals(temp.next.key)) {

            //假设temp.next 是要删除的节点                    
                temp.next = temp.next.next;                                        
            }

上面代码可以删除,但可能会导致内存泄漏(这里看不出会泄露)。

第一种链表图如下所示:

clipboard.png

  • 第一种内容表达是仅仅删除deNode节点

第二种链表操作如下所示

clipboard.png

  • 第二种表达的删除了temp.next节点
  • 同时也删除了temp.next.next后面所有的节点
你知道吗?

宣传栏