Java中简单LinkedList的自我实现

时间:2016-06-16 13:38:42

标签: java list linked-list

我正在阅读有关Java中简单LinkedList实现的this文章,并对其进行了调整,几乎没有对我的小项目进行任何更改。一切都运作良好,但删除方法 这笔交易是我必须删除相应的元素。我的意思是(这是我的删除方法):

private Link head;

public void remove(Object obj) {
    if (task == null)
        System.out.println("no");
    else {
        Link linkCurr = head;
        if (head != null) {
            for (int i = 0; i < size; ++i) {
                if (obj.equals(linkCurr.getData())){
                    linkCurr.setNext(linkCurr.getNext().getNext());
                    size--;
                    break;
                }
                linkCurr = linkCurr.getNext();
            }
        }
    }
}

这是运行节点和链接逻辑的类。

private class Link 
{ 
    Link next;

    Object data;

    public Link(Object data) {
        next = null;
        this.data = data;           
    }

    public Task getData() {
        return data;
    }

    public Link getNext() {
        return next;
    }

    public void setNext(Link next) 
    {
        this.next = next;
    }  
}

所以,问题是以下 - 当我删除列表中的第一个obj时(通过将其设置为删除参数) - 它会消失,但如果我尝试删除第二个或任何其他内容,下一个我想要删除后 我要感谢任何帮助,提前谢谢。如果需要更多信息,我的LinkedList here!的完整代码。

1 个答案:

答案 0 :(得分:4)

问题似乎出现在这段代码中:

    Link linkCurr = head;
    if (head != null) {
        for (int i = 0; i < size; ++i) {
            if (obj.equals(linkCurr.getData())){
                linkCurr.setNext(linkCurr.getNext().getNext());
                size--;
                break;
            }
            linkCurr = linkCurr.getNext();
        }
    }

这样做是在列表中搜索与输入节点匹配的节点。然后,它将该节点的下一个链接设置为线下的节点2,删除相邻节点。

您可能希望保留上一个节点的索引,并在其上执行setnext,如:

    Link linkCurr = head;
    Link previous = null;
    if (head != null) {
        for (int i = 0; i < size; ++i) 
        {
            if (obj.equals(linkCurr.getData()))
            {
                if (previous == null)
                {
                    head = linkCurr.getNext(); // sets 2nd position to head of list
                    size--;
                    break; 
                }
                previous.setNext(linkCurr.getNext()); // removes the node
                size--;
                break;
            }
            previous = linkCurr;
            linkCurr = linkCurr.getNext();
        }
    }