有一个任务来创建将元素链接在一起的类。 方法get((,add((和remove((是由赋值预定义的。
我实际上设法编写了创建此类链表的代码, 但除了值为"Yo!"的实例被覆盖外,当 将新元素添加到列表中,我也无法让 remove 方法工作。 我真的不能以这种方式引用对象。 你能帮我纠正我的代码吗?
/**
*
* Represents a linked list of elements.
*
* @param <T>
*/
class LinkedElement<T> {
/**
* Adds a new linked element holding the given value at the end of the linked
* elements.
*
* @param newVal the new value.
*/
public void add(T newVal) {
if (head == null) {
head = new Element(newVal);
}
Element next = new Element(newVal);
Element current = head;
if (current != null) {
while (current.getNext() != null) {
current = current.getNext();
}
current.setNext(next);
}
increaseListSize();
}
/**
* Removes the i-th element from the linked elements. If {@code i == 0}, this
* will effectively remove the head element. Thus, this method returns the
* linked element that is the new head element.
*
* @param i index of the element to remove.
* @return the new head element.
*/
public LinkedElement<T> remove(int i) {
if (i < 1 || i > getListSize())
return null;
Element current = head;
if (head != null) {
for (int e = 0; e < i; i++) {
if (current.getNext() == null)
return null;
current = current.getNext();
}
current.setNext(current.getNext().getNext());
decreaseListSize();
}
return null;
}
你的get
方法有点错误,你需要从head
而不是head.next()
开始current
public T get(int i) {
if (i < 0)
return null;
Element current = head;
if (current != null) {
for (int e = 0; e < i; e++) {
if (current.getNext() == null)
return null;
current = current.getNext();
}
return current.getValue();
}
return null;
}
你的 get 方法有一个错误:Element current = head;
是正确的。
有几件事在您的删除方法中不起作用。这个应该可以工作:
public void remove(int i) {
if (i==0) {
head = head.getNext();
decreaseListSize();
return;
}
if (i < 1 || i > getListSize()) {
return;
}
Element current = head;
if (head != null) {
for (int e = 1; e < i; e++) {
if (current.getNext() == null)
return ;
current = current.getNext();
}
current.setNext(current.getNext().getNext());
decreaseListSize();
}
}
请注意,我将返回类型更改为 void,因为您的方法在任何情况下都返回 null,并且不需要返回 head。如果你想返回 head 元素,你可以很容易地调整它并返回 head 而不是什么都不返回。 此外,请注意,计数 - 就像计算机科学中经常发生的那样 - 从 0 开始。要删除第一个元素,您必须编写headElement.remove(0);
。