2014-05-11 152 views
0

我试图删除单个链接列表中两个其他节点中间的节点。删除位于链接列表中间的节点

public void deleteAfter(Node del){ 
     del.next=del.next.next; 
    } 

它删除指定节点del之后的节点。
我得到一个空指针异常。我认为这个问题是删除后与其他节点的链路broken.How我来修补它。这里是我的全码:

public class Node{ 
    public Object item; 
    public Node next; 
    public Node(){ 
     item=null; 
     next=null; 
    } 
    public Node(Object x){ 
     item=x;  
     next=null; 
    } 

    public void insertAfter(Node after,Object x){ 
     Node newNode=new Node(x); 
     newNode.next=after.next; 
     after.next=newNode; 
    } 
    public void deleteAfter(Node del){//Deletes the node that is after the specified node 
     del.next=del.next.next; 
    } 
    public static void main (String args[]){ 
    Node front=new Node(),p=new Node(),q=new Node(); 
    p.item="green"; 
    q.item="red"; 
    p.next=q; 
    front=p; 
    front.deleteAfter(p); 
    front.insertAfter(p,"black"); 

    front.insertAfter(q,"blue"); 
    front.insertAfter(q.next,"orange"); 
    front.deleteAfter(q); 
    System.out.println(front.item); 
    System.out.println(front.next.item); 
    System.out.println(front.next.next.item); 
    System.out.println(front.next.next.next.item); 
    } 
} 
+0

您的删除代码不处理输入本身是最后一个节点的情况。 – jxh

+0

这是当要删除的节点位于其他两个节点的中间时 –

回答

1

首先您的列表应该记得最后一个元素或头。

public class YourList{ 
    Node heaed; 
    public YourList(){ 
     head = null; 
    } 
    public void insert(Node node){ 
    if(last == null){ 
     head = node; 
    } 
    } 
    public void deleteAfter(Node del){ 
     if(del.next == head)){ 
      head = del; 
     } 
     if(del.next == null){ 
      //do nothing because there is nothing to delete 
     } 
     else{ 
     del.next=del.next.next; 
     } 
    } 

} 
+0

为什么我必须记住last或head元素。如果中间节点被删除,那么为什么不是'del.next = del.next.next ; '足够的 –

+0

因为当你没有任何你的列表数据的句柄。所以简单地添加任何元素是没有意义的,因为你无法检索它:)请粘贴你的'List'结构。 – RMachnik

+0

尝试阅读。 http://www.danielacton.com/Data-Structures/Linked-List/Java/ – RMachnik

0

在:

p.next=q; 
    front=p; 
    front.deleteAfter(p); 
    front.insertAfter(p,"black"); 

您已经创建开始p两个节点的链接列表,并指出front它,那么你就萎缩下来到一个节点链表,撞到回来到两个,由{“绿色”,“黑色”}组成。 q是您稍后操作的单例列表节点。

当您从front开始打印时,由于它只有两个节点,因此尝试获取不存在的第三个节点item会导致您的异常。

你的问题始于询问你的deleteAfter()是否有问题,并且它不能正确处理任何正确的节点列表,而只是一个实际上有一些东西的列表。传入一个空列表或列表中只有一个节点将导致异常。

+0

中定义,尽管我最初只创建了两个节点p,q,当我调用inserFront()方法时I我正在创建新的节点吗?那么怎么才能从前面开始打印,因为它只有两个节点,试图获得不存在的第三个节点的项目会导致你的异常。“'发生了吗?因为有3个节点”红色“,”green“,q –

+0

'front.deleteAfter(p)'将列表减少一个,这样它只有一个节点。然后'front.insertAfter(p,“black”)'将它从一个增加到两个。 – jxh

0

您可以先使用两个指针方法找到中间节点,然后删除该节点。

public Node findMiddleNode(Node node){ 
    Node runner = node; 
    while(node!=null){ 
     node = node.next; 
     if(node != null){ 
      node = node.next; 
      runner = runner.next; 
     } 
    } 
    return runner; 
} 

public static boolean deleteNode(Node node){ 
    if(node==null || node.next==null) return false; 
    Node next = node.next; 
    node.data = next.data; 
    node.next = next.next; 

    return true; 
}