我试图理解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)复杂性。
答案 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);
}
}