2016-09-22 89 views
0

我的目标是给出函数“omit”一个整数,如果该整数位于节点的on信息槽中,该节点将被删除。我明白我必须做什么,只是很难执行它。这里是我ListNode内部类:需要帮助从Java链接列表中删除ListNode

private int howmany; 
private ListNode c; 

private class ListNode { 
    private int info; 
    private ListNode link; 

    public ListNode() { 
     info = 0; 
     link = null; 
    } 

    public ListNode(int i, ListNode pointer) { 
     info = i; 
     link = pointer; 
    } 
} 

这里是我试过的方法省略:

public void omit(int i){ 

    ListNode pointer; 
    pointer = c; 
    if (pointer.info == i){ 
     pointer=pointer.link; 
    } 

    ListNode prev = pointer; 
    ListNode curr = pointer.link; 

    while (curr != null) { 
     if (curr.info == i){ 
      prev.link = curr.link; 
     }else{ 
      prev = prev.link; 
      curr = curr.link; 
     } 
    } 

此省略方法是行不通的。我在我的客户端尝试了它,并且我尝试省略的号码仍保留在列表中。谁能告诉我我做错了什么?

+0

什么是行'指针= C' C吗?不应该忽略列表作为输入? – proton

+0

c代表列表中数字的集合。为什么omit没有收到列表作为输入是因为我想让用户输入列表中的数字,然后删除该数字。 –

+0

所以你应该上传整个代码。 – proton

回答

0

假设你找到一个节点curr.info == i。在这种情况下,您不会修改导致无限循环的curr。此外,在列表的开始处,您最多跳过一个节点,但可以有任意数量的需要忽略的节点。

接近这一点的最好办法是通过列表迭代和连接这是不与未中省略最后一个中省略的一个节点:

public void omit(int i){ 

    // remove elements from the start of the list 
    while (c != null && c.info == i) { 
     c = c.next; 
    } 
    ListNode lastKept = c; 
    ListNode current = c; 
    while (current != null) { 
     current = current.next; 

     // find next node to be kept 
     while (current != null && current.info == i) { 
      current = current.next; 
     } 
     lastKept.next = current; 
     lastKept = current; 
    } 
}