2016-01-30 70 views
0

我正在处理链接列表,并且当前无法通过键值删除speficic节点。我在学校问了一个帮手,他不确定为什么它不起作用(另外一个问题也有很多的问题,我很抱歉,看起来有多严重)删除节点的问题

这是我的删除方法:

public void remove(int key) throws Exception { 
     Node tmp = first; 
     Node pred = first; 

     while (tmp != null) { 
      if (tmp.keyValue == key) { 
       pred = tmp; 
       tmp = tmp.next; 

      } else { 
       tmp = tmp.next; 
      } 

     } 

这是我的主要方法creaing名单,并试图将其删除,并打印:

OrderedLinkedList oLL3 = new OrderedLinkedList(); 
     try { 
      oLL3.insert("Should be removed", 5); 
      oLL3.insert("Shouldn't be removed 2nd", 15); 
      oLL3.insert("Shouldn't be removed", 10); 
     } catch (Exception e) { 
      System.out.println("Error: Two nodes with the same key value and the newest one won't be stored."); 
     } 
     try { 
      oLL3.remove(5); 
     } catch (Exception r) { 
      System.out.println("Error:No nod with the key value to be removed"); 
     } 
     System.out.print("toString test removing node: \n" + oLL3.toString()); 

     System.out.println("Number of nodes in the List:" + oLL3.listCount()); 


     } 

回答

0

remove方法仅分配给本地变量。这不会影响链接列表中的状态。假设您的列表头是first字段中的节点,则需要将其分配给另一个节点中的first.next字段。

要删除的第一个节点,你可以这样做:

first = first.next; 

要删除节点prev后的节点,你可以这样做:

prev.next = prev.next.next; 

(空检查在适当情况下)

+0

我的tmp和pred节点变量被分配给remove方法中的第一个节点。或者你的意思是别的吗? –

+0

它们是局部变量。分配给他们不会影响他们所属方法之外的任何内容。 – khelwood

+0

所以你说的不是先分配方法中的本地东西,而是先分配一些不是局部变量的东西? (我也只是不能创建任何成员变量,除了第一个。) –

1

在显示的这段代码中,您正在删除链表的第一个节点,并删除第一个节点,您需要将“head”(或头节点的任何名称)指向第二个节点,即

head = head.next;