当前位置: 首页 > 知识库问答 >
问题:

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

姜业
2023-03-14

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

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

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

共有1个答案

周子平
2023-03-14

对于所讨论的代码(代码中的注释包含附加解释)。

这确实满足了这样的要求:“如果原来的列表是1->6->5,而另一个列表是3->8->2。调用之后,列表现在是1->6->5->3->8->2。”

它会追加元素(节点),因此追加后两个列表共享相同的节点。这应该没问题。但是,这意味着如果“othrlist”中的一个节点在追加后发生了变化,那么它在列表中也会发生变化。通常这是预期的行为。因此它是“浅”的,不会创建任何不必要的(深度)元素副本。

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).
}
 类似资料:
  • 我想在java中创建一个方法,该方法接收两个字符串列表:

  • 问题内容: 假设我有两个列表,l1和l2。我要执行l1 - l2,返回l1not中的所有元素l2。 我可以想到一个幼稚的循环方法来执行此操作,但这实际上效率很低。什么是Python高效的方法? 例如,如果我有,应返回 问题答案: Python具有称为List Comprehensions的语言功能,非常适合使这种事情变得非常容易。以下语句完全满足你的要求,并将结果存储在l3: l3将包含。

  • 问题内容: 给出以下列表: 我想将[a]的每个元素重复其在[b]中的对应位置的编号,以产生此结果: 即0发生1次,5发生2次,1发生1次。 问题答案: 内容如下: -重复elem次 从两个列表中组成一个2元组的列表,将每个元素与另一个列表中的对应元素配对。这为您提供了用例中需要传递给的确切信息。 -将迭代器的结果列表展平为单个值列表。您既可以像我一样,也可以像马丁·彼得斯那样。

  • 问题内容: 如果我有:和 如果调用,我是否可以通过这种方式将linkedlist2附加到linkedlist1的末尾: 它变为并 变为? 那可能吗 ?还是我需要其他结构? 以下代码不起作用: 输出: 问题答案: Java提供的标准LinkedList类缺少此功能。 正如Donal Boyle所发布的那样,您可以将一个列表的内容添加到另一个列表中,但这并不能像您所描述的那样保持链接。

  • 问题内容: 我正在研究数据结构和链表,但是我没有得到如何制作链表副本的概念。有人可以使用伪代码或C代码进行解释吗? 问题答案: 复制链表的逻辑是递归的,并且基于以下观察结果: 空列表的克隆是空列表。 具有第一个节点x和其余节点xs的列表的克隆是x的副本,该副本位于xs的克隆之前。 如果您使用C ++对链表进行编码,则可以很干净:

  • 我有一个数字列表L。还有另一个数字列表M。我需要返回一个在L和M中找到的数字列表L。 编辑:从数学上讲,我正在寻找多集交点。 例子: L=3,,4,,5,,,6 M=,7,,,,1 L'=9,1,2,1 我为此编写了以下代码: 虽然它达到了目的,但我想知道是否有一种惯用的Perl6方法可以做到这一点? 一些背景:我一直在尝试一起学习Perl6和Python,并用这两种语言解决相同的难题。Pytho