Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将一个链表中的所有元素追加到另一个列表的末尾_Java_Linked List - Fatal编程技术网

Java 将一个链表中的所有元素追加到另一个列表的末尾

Java 将一个链表中的所有元素追加到另一个列表的末尾,java,linked-list,Java,Linked List,我在编写将一个方法的参数列表中的所有元素追加到另一个列表末尾的方法时遇到问题。如果列表发生更改,则该方法应返回true,否则返回false 例如,如果原始列表为1->6->5,而另一个列表为3->8->2。通话结束后,列表现在是1->6->5->3->8->2 我对布尔返回语句有困难,因为我不清楚它们是如何链接到列表逻辑的。我也不知道指针需要移动多远才能附加列表。整个过程可以在一个循环中完成,但我不知道如何完成 public boolean appendList(DynamicList othr

我在编写将一个方法的参数列表中的所有元素追加到另一个列表末尾的方法时遇到问题。如果列表发生更改,则该方法应返回true,否则返回false

例如,如果原始列表为1->6->5,而另一个列表为3->8->2。通话结束后,列表现在是1->6->5->3->8->2

我对布尔返回语句有困难,因为我不清楚它们是如何链接到列表逻辑的。我也不知道指针需要移动多远才能附加列表。整个过程可以在一个循环中完成,但我不知道如何完成

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;
  }
}

对于有问题的代码,代码中的注释包含附加解释

这确实满足了要求:如果原始列表是1->6->5,而另一个列表是3->8->2。通话结束后,列表现在是1->6->5->3->8->2

它附加元素节点,因此在附加两个列表后,共享相同的节点。应该没问题。但是,这意味着,如果附加后OthList中的节点发生更改,它也将在列表中更改。通常这是预期的行为。 因此它很浅,不会创建任何不必要的元素深度副本

总而言之,op在他的方法中选择的方法是:一!循环,仅追加,不复制

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).
}

布尔返回值应该指示什么?如果它与标准返回值类似,它总是返回true,因此您只需编写一个返回true的代码;语句是方法的结尾。@JohnKugelman我已经添加了我的代码tried@Andreas返回值应该指示列表是否已更改。因此,如果它改变了它应该返回true和false,如果它没有,我已经删除了注释和压缩方法,以便我们更容易扫描您的代码并查看有问题的方法。@K.Xiang然后用if othrist.isEmpty return false启动方法;,然后执行将othrList的节点复制到此列表末尾的逻辑,最后返回true;。这将使两个列表共享一些节点,这是不合适的。必须复制othrList的节点。@Andreas这样做是正确的。列表不会被复制,而是作为op请求追加。这意味着Otherlist将继续存在,并成为列表的尾部。复制并没有被请求,并且按照要求,这将是一个形式上错误的实现:列表本身必须被追加,而不仅仅是其中的值。问题是追加所有元素。它并没有说附加所有节点。元素是节点中的值/数据/信息。让我们看看什么对op有用。如果op声明,他的要求是在oposite中复制以附加,我很乐意添加另一个循环,这就是为什么我要写一个答案:希望能帮助op解决他的问题。如果你认为op是否需要附加节点或附加元素还不清楚,即使问题说的是元素,那么你应该在评论中要求澄清。