如何在 Java 中的双向链表中追加一个节点?
How to append a node in a doubly linked list in Java?
开始学习了Java。作为一项任务,我必须使用我包含在代码中的给定接口实现一个双向链表。
我的方法 insertAtTheEnd()
似乎无法正常工作,因为我在插入多个元素后在元素上获得了值 null
。
我检查了关于该主题的类似问题,并尝试将答案应用于我的问题,但无法进一步解决。因此,感谢任何帮助我如何设置此方法以使其工作。
谢谢!
public interface IValueElement
{
public String getName();
public void setName(String paramName);
public int getValue();
public void setValue(int paramValue);
}
public interface IListElement
{
public IValueElement getValueElement();
public void setValueElement(IValueElement value);
public IListElement getPredecessor();
public void setPredecessor(IListElement predecessor);
public IListElement getSuccessor();
public void setSuccessor(IListElement successor);
}
public interface IList
{
public IListElement getHead();
public void insertAtTheEnd(IValueElement value);
//...
}
public class List implements IList
{
public List()
{
if (head == null)
{
head = new ListElement(null);
}
else
{
return;
}
}
private IListElement head;
public IListElement getHead()
{
return head;
}
public void insertAtTheEnd(IValueElement value)
{
if (head.getSuccessor() != null)
{
IListElement l = head;
while (l.getSuccessor() != null)
l = l.getSuccessor();
IListElement q = new ListElement(value);
l.setPredecessor(q);
}
else
{
IListElement q = new ListElement(value);
q.setPredecessor(head);
q.setSuccessor(null);
head.setSuccessor(q);
head.setPredecessor(q);
}
}
}
此外,这是我对 ValueElement 和 ListElement 的实现:
//ListElement.java
public class ListElement implements IListElement
{
public ListElement(IValueElement value)
{
this.valueElement = checkValueElementAttribute(value);
}
private IValueElement checkValueElementAttribute(IValueElement value)
{
return (value == null) ? new ValueElement(null, 0) : value;
}
private IValueElement valueElement;
public IValueElement getValueElement()
{
return this.valueElement;
}
public void setValueElement(IValueElement value)
{
if (value != null)
{
this.valueElement = value;
}
}
private IListElement predecessor;
public IListElement getPredecessor()
{
return this.predecessor;
}
public void setPredecessor(IListElement predecessor)
{
this.predecessor = predecessor;
}
private IListElement successor;
public IListElement getSuccessor()
{
return this.successor;
}
public void setSuccessor(IListElement successor)
{
this.successor = successor;
}
}
// ValueElement.java
public class ValueElement implements IValueElement
{
private String name;
public String getName()
{
return this.name;
}
public void setName(String paramName)
{
if (paramName != null)
{
this.name = paramName;
}
}
public ValueElement(String name, int value)
{
if (name == null || name.equals(""))
{
name = "default";
}
else
{
this.name = name;
}
this.value = value;
}
private int value;
public int getValue()
{
return this.value;
}
public void setValue(int paramValue)
{
if (paramValue != 0)
{
this.value = paramValue;
}
}
public String toString()
{
return "Name: " + this.name + " - Value: " + this.value;
}
}
是否为您提供了 IValueElement 和 IListElement 的实现,或者它们是否也必须实现?从您提供的代码中,我看不到它们的实现。
关于您的方法 insertAtTheEnd,看起来您的想法大部分是正确的,但也许您可以改进它。
在 if 块的末尾,您将 l 的前导设置为 q。我认为这可能是错误的方式。 l 在那一点是列表中的最后一个元素,沿着后继链一直走直到没有更多,在我看来,新元素 (q) 现在应该作为 l 的后继而不是前导添加。
此外,我认为 q 需要将其前身设置为 l。
在你的else块中正确设置了q的前驱和后继,并且正确设置了head的后继,但是,为什么你将head的前驱设置为q?这将使 q 成为 head 的继任者和前任。我认为您应该删除最后一个 setPredecessor 调用。
请提供完整的代码,以便我们可以运行帮助您目前我们只能想到这些问题:
1) 您可能没有在这些节点上调用 setValueElement
2)你的 else 块包含同一元素的前导和后继的设置,所以它是一个明确的错误代码行
这不应该是你的密码吗
public void insertAtTheEnd(IValueElement value)
{
if (head.getSuccessor() != null)
{
IListElement l = head;
while (l.getSuccessor() != null)
l = l.getSuccessor();
IListElement q = new ListElement(value);
l.setSuccessor(q);
}
else
{
IListElement q = new ListElement(value);
q.setPredecessor(head);
q.setSuccessor(null);
head.setSuccessor(q);
}
}
开始学习了Java。作为一项任务,我必须使用我包含在代码中的给定接口实现一个双向链表。
我的方法 insertAtTheEnd()
似乎无法正常工作,因为我在插入多个元素后在元素上获得了值 null
。
我检查了关于该主题的类似问题,并尝试将答案应用于我的问题,但无法进一步解决。因此,感谢任何帮助我如何设置此方法以使其工作。
谢谢!
public interface IValueElement
{
public String getName();
public void setName(String paramName);
public int getValue();
public void setValue(int paramValue);
}
public interface IListElement
{
public IValueElement getValueElement();
public void setValueElement(IValueElement value);
public IListElement getPredecessor();
public void setPredecessor(IListElement predecessor);
public IListElement getSuccessor();
public void setSuccessor(IListElement successor);
}
public interface IList
{
public IListElement getHead();
public void insertAtTheEnd(IValueElement value);
//...
}
public class List implements IList
{
public List()
{
if (head == null)
{
head = new ListElement(null);
}
else
{
return;
}
}
private IListElement head;
public IListElement getHead()
{
return head;
}
public void insertAtTheEnd(IValueElement value)
{
if (head.getSuccessor() != null)
{
IListElement l = head;
while (l.getSuccessor() != null)
l = l.getSuccessor();
IListElement q = new ListElement(value);
l.setPredecessor(q);
}
else
{
IListElement q = new ListElement(value);
q.setPredecessor(head);
q.setSuccessor(null);
head.setSuccessor(q);
head.setPredecessor(q);
}
}
}
此外,这是我对 ValueElement 和 ListElement 的实现:
//ListElement.java
public class ListElement implements IListElement
{
public ListElement(IValueElement value)
{
this.valueElement = checkValueElementAttribute(value);
}
private IValueElement checkValueElementAttribute(IValueElement value)
{
return (value == null) ? new ValueElement(null, 0) : value;
}
private IValueElement valueElement;
public IValueElement getValueElement()
{
return this.valueElement;
}
public void setValueElement(IValueElement value)
{
if (value != null)
{
this.valueElement = value;
}
}
private IListElement predecessor;
public IListElement getPredecessor()
{
return this.predecessor;
}
public void setPredecessor(IListElement predecessor)
{
this.predecessor = predecessor;
}
private IListElement successor;
public IListElement getSuccessor()
{
return this.successor;
}
public void setSuccessor(IListElement successor)
{
this.successor = successor;
}
}
// ValueElement.java
public class ValueElement implements IValueElement
{
private String name;
public String getName()
{
return this.name;
}
public void setName(String paramName)
{
if (paramName != null)
{
this.name = paramName;
}
}
public ValueElement(String name, int value)
{
if (name == null || name.equals(""))
{
name = "default";
}
else
{
this.name = name;
}
this.value = value;
}
private int value;
public int getValue()
{
return this.value;
}
public void setValue(int paramValue)
{
if (paramValue != 0)
{
this.value = paramValue;
}
}
public String toString()
{
return "Name: " + this.name + " - Value: " + this.value;
}
}
是否为您提供了 IValueElement 和 IListElement 的实现,或者它们是否也必须实现?从您提供的代码中,我看不到它们的实现。
关于您的方法 insertAtTheEnd,看起来您的想法大部分是正确的,但也许您可以改进它。
在 if 块的末尾,您将 l 的前导设置为 q。我认为这可能是错误的方式。 l 在那一点是列表中的最后一个元素,沿着后继链一直走直到没有更多,在我看来,新元素 (q) 现在应该作为 l 的后继而不是前导添加。 此外,我认为 q 需要将其前身设置为 l。
在你的else块中正确设置了q的前驱和后继,并且正确设置了head的后继,但是,为什么你将head的前驱设置为q?这将使 q 成为 head 的继任者和前任。我认为您应该删除最后一个 setPredecessor 调用。
请提供完整的代码,以便我们可以运行帮助您目前我们只能想到这些问题:
1) 您可能没有在这些节点上调用 setValueElement 2)你的 else 块包含同一元素的前导和后继的设置,所以它是一个明确的错误代码行
这不应该是你的密码吗
public void insertAtTheEnd(IValueElement value)
{
if (head.getSuccessor() != null)
{
IListElement l = head;
while (l.getSuccessor() != null)
l = l.getSuccessor();
IListElement q = new ListElement(value);
l.setSuccessor(q);
}
else
{
IListElement q = new ListElement(value);
q.setPredecessor(head);
q.setSuccessor(null);
head.setSuccessor(q);
}
}