我在编写将方法参数列表中的所有元素附加到另一个列表末尾的方法时遇到了麻烦。如果列表已更改,则该方法应返回true,否则返回false。
例如,如果原始列表是1-> 6-> 5,而另一个列表是3-> 8-> 2。通话后,列表现在为1-> 6-> 5-> 3-> 8-> 2。
我在使用布尔型return语句时遇到了麻烦,因为我很困惑它们如何链接到列表的逻辑中。我也不知道为了追加列表指针需要移动多远。整个过程可以一次完成,但我不知道如何做。
public boolean appendList(DynamicList othrList) {
for (DynamicNode tmp = head; tmp != null; tmp.getNext()) {
if(tmp == null) {
DynamicNode ex = otherList.getList;
tmp.setNext(ex);
}
return true;
}
return false;
}
完整代码:
public class DynamicNode {
private Object info; // the data in the node
private DynamicNode next; // refers to the next node on the list
public DynamicNode(Object x, DynamicNode n) {
info = x;
next = n;
}
public Object getInfo() { return info; }
public DynamicNode getNext() { return next; }
public void setInfo(Object x) { info = x; }
public void setNext(DynamicNode n) { next = n; }
public String toString() { return info.toString(); }
}
class DynamicList {
private DynamicNode head;
public DynamicList() { head = null; }
public DynamicList(DynamicNode head) { this.head = head; }
public boolean isEmpty() { return head == null; }
public DynamicNode getList() { return head; }
// The problem
public boolean appendList(DynamicList othrList) {
for (DynamicNode tmp = head; tmp != null; tmp.getNext()) {
if(tmp == null) {
DynamicNode ex = otherList.getList;
tmp.setNext(ex);
}
return true;
}
return false;
}
}
答案 0 :(得分:-1)
有关代码(代码中的注释带有附加说明)。
这确实满足了要求:“如果原始列表是1-> 6-> 5,而另一个列表是3-> 8-> 2。在通话之后,列表现在是1-> 6-> 5-> 3-> 8-> 2。”
它附加元素(节点),因此在附加两个列表之后共享相同的节点。哪个应该可以。但是,这意味着,如果“ othrlist”中的节点在追加后发生更改,则它也将在列表中发生更改。通常这是预期的行为。 因此它是“浅”的,不会创建任何不必要的(深层)元素复制。
总而言之,这是操作者在其方法中选择的方法的一种方式:One(!)循环,仅追加而不复制。
public boolean appendList(DynamicList othrList) {
DynamicNode tmp = head;
if(tmp == null) { //special case empty list
head = othrList.getList();
return null != head; //early exit, list changed if head is no longer null.
}
while (tmp.getNext() != null) tmp = tmp.getNext(); //search for the last element
tmp.setNext(othrList.getList()); //link last element to head of other.
return null != tmp.getNext(); //list changed if tmp.next is no longer null(as it was before).
}