Java单个LinkedList添加O(1)复杂性

时间:2017-05-25 11:28:48

标签: java data-structures singly-linked-list

我试图理解LinkedLists(准确地说是单链接列表)。

我听说/读取删除和添加操作将以O(1)复杂度执行,而我仍然没有得到如何实现这两个操作的O(1)复杂性。 下面是我在java中的实现(注意:我不知道c,c ++编码,所以我最近开始理解数据结构)。

public class Node
{
    private Integer data    = null;
    private Node    next    = null;
    private int     size    = 0;

    public Node()
    {

    }

    private Node(Integer data)
    {
        this.data = data;
    }

    public boolean add(Integer data)
    {
        if (null == data) return false;
        if (null == this.data)
        {
            this.data = data;
        }
        else
        {
            if (null == this.next)
            {
                this.next = new Node(data);
            }
            else
            {
                this.next.add(data);
            }
        }
        size += 1;
        return true;
    }

    public Integer getDataAt(int index)
    {
        if (index == 0)
        {
            return this.data;
        }
        else
        {
            return this.next.getDataAt(index - 1);
        }
    }

    public int getSize()
    {
        return size;
    }
}

请建议我现在编辑添加(数据)以使其成为O(1)复杂性。

3 个答案:

答案 0 :(得分:4)

仅在LinkedList中添加和删除操作 O(1),但遍历到要删除或添加的节点是 O(N)操作

如果保留对最后添加元素的引用,则可以实现O(1)复杂性,这样就可以将新节点添加到最后一个遍历元素的下一个节点。

答案 1 :(得分:1)

在linkedList中,如果你有指向节点链表的第一个和最后一个的头和尾指针,那么在恒定时间你可以在节点的第一个或最后一个位置添加和删除。如果你想删除一个元素,你必须找到它元素,在最坏的情况下,元素将在最后。在双重链表中,你可以从开始和结束开始,所以你必须遍历,直到最坏的情况下它将是O(n)。

答案 2 :(得分:0)

感谢您的支持,作为数据结构中的NOOB,我想了解ds是如何工作的,而不是从某人的其他实现中复制粘贴。

Neeraj Jain& Gati Sahu的解释/回答帮助我实现了我在LinkedList中寻找添加(数据)的复杂性(

)。

所以我做的是"隔离普通节点类并使用操作创建LinkedList类。

class Node
{
    private Integer data    = null;
    private Node    next    = null;

    public Node(Integer data)
    {
        super();
        this.data = data;
    }

    public Integer getData()
    {
        return data;
    }

    public Node getNext()
    {
        return next;
    }

    public void setData(Integer data)
    {
        this.data = data;
    }

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

}

public class LinkedList
{
    Node    head;
    Node    end;

    public Node getHead()
    {
        return head;
    }

    public boolean add(Integer data)
    {
        if (null == head)
        {
            head = new Node(data);
            end = head;
        }
        else
        {
            addAtEnd(data);
        }
        return true;
    }

    public void addAtEnd(Integer data)
    {
        end.setNext(new Node(data));
        end = end.getNext();
    }

    public void addAtFirst(Integer data)
    {
        Node tmpNode = head;
        head = new Node(data);
        head.setNext(tmpNode);
    }
}