我正在尝试为我的链接列表创建一个Add和Delete方法。我用头和尾的名字做了2个引用。
头 - > 1 - > 2 - > 3 - >尾:空
当我尝试删除特定节点时,我一直遇到问题,因为Java说我不在界外。我想是因为我的Head没有指向第一个节点?你们有什么感想?或者我是以完全错误的方式解决这个问题......
public class LinkedList{
private Node head;
private Node tail;
private int listCount;
public LinkedList()
{
head = new ListNode(null);
tail = new ListNode(null);
listCount = 0;
}
public void add(Object elem){
ListNode newNode = new ListNode(elem);
if (size() == 0){
newNode = head;
tail = head;
}
newNode.setLink(tail);
tail = newNode;
listCount++;
}
public Object delete(int index)
// post: removes the element at the specified position in this list.
{
// if the index is out of range, exit
if(index < 1 || index > size())
throw new IndexOutOfBoundsException();
ListNode current = head;
for(int i = 1; i < index; i++)
{
if(current.getLink() == null)
throw new IndexOutOfBoundsException();
current = current.getLink();
}
current.setLink(current.getLink().getLink());
listCount--; // decrement the number of elements variable
return current.getInfo();
}
public int size() {
return listCount;
}
}
public class Node {
private Node link;
private Object info;
public Node(Object info)
{
this.info = info;
link = null;
}
public void setInfo(Object info)
{
this.info = info;
}
public Object getInfo()
{
return info;
}
public void setLink(Node link)
{
this.link = link;
}
public Node getLink()
{
return link;
}
}
答案 0 :(得分:2)
在设置初始(空)链表时,您似乎没有从头到尾初始化链接。
确定。这是在使用单链表时使用的策略(仅限前向链接)。您需要确定列表中允许的操作(例如,仅从头部或尾部添加/删除?;或者在链接列表中的任何位置添加和删除节点(在切断节点后将列表重新组合在一起)。你将允许从任何地方删除节点,然后你需要有一种方法可以无法识别每个节点(这样你就可以毫不含糊地确定将被删除的节点)。你可能还希望能够在之前添加一个节点或者在某个其他节点之后。并且可能需要唯一性。如果您不关心在之前/之后删除或添加的值,那么您可以放宽唯一性约束。
现在要实施战略。从头开始(最初为null)。
这有帮助吗?
答案 1 :(得分:1)
我认为这是因为您的head
从不与任何内容相关联。我要做的是修复它,在你的添加方法中,检查列表的size
;如果为0,则将头设置为新元素,并将tail
设置为head
。如果为1,则将head
链接到新节点并设置tail
。如果它是2,只需将tail
的链接设置为新节点并设置tail
(就像您现在一样)。
此外,我不确定您是如何实施的,但newNode.setLink(tail);
似乎有误...... tail
应与newNode
相关联。从它看起来的方式来看,似乎你正在尝试newNode - &gt;尾
编辑:好的,这就是为什么我会尝试
public void add(Object elem){
ListNode newNode = new ListNode(elem);
if (size() == 0){
newNode = head;
tail = head;
}else if(size() == 1){
head.setLink(newNode);
tail = newNode;
}else{
tail.setLink(newNode);
tail = newNode;
}
listCount++;
}