【问题标题】:Extracting the first n elements from a Singly Linked List从单链表中提取前 n 个元素
【发布时间】:2019-04-04 00:24:22
【问题描述】:

我正在尝试编写一个方法,该方法接受一个整数 n 并返回一个新列表,其中包含其当前对象 List 的前 n 个元素,其顺序与它们在当前列表中出现的顺序相同。

下面提供了我的解决方案:

public List firstNelements(int n) {
    List newList = newList();
    Node travel = head, last = null, newNode;
    int counter = 0;
    while (counter < n && travel != null) {
        newNode = new Node();
        newNode.data = travel.data;

        if (last == null)
            last = newList.head = newNode;
        else last = last.next = newNode;

        counter++;
        travel = travel.next;
    }
    return newList;
}

我了解该方法从声明一个新列表开始。从那里,它声明了“旅行”节点,用于遍历当前列表。另外,我相信“last”只是用来跟踪当前对象中的最后一个节点。

我也理解了while循环的第一部分;但是,我不明白为什么有条件

if (last == null)
            last = newList.head = newNode;
        else last = last.next = newNode;

存在。第一次执行代码时,节点“last”为空,所以在第一次迭代中,我猜我们将 newNode 设置为新列表的头部。但是为什么我们也要最后更新呢?这是否意味着“last”正在跟踪新列表中的最后一个节点?我也不知道“其他”语句在这里做什么。

我已经在 n = 2 的情况下遍历了列表 {1, 2, 3}。但是,我仍然无法理解它。 while 循环的其余部分(在这个条件之后)对我来说是有意义的。

【问题讨论】:

    标签: java linked-list singly-linked-list


    【解决方案1】:

    您必须使用的对象似乎是一个链接列表,即每个node 都引用了列表中的下一个node。一个节点是特殊的,称为head。这允许遍历从开头head 到结尾的所有元素(当.nextnull 时)。在第一次迭代期间,这个head 必须设置为列表中有一些东西以便稍后迭代。当lastnull 时,while 循环第一次执行。如果这不是第一个循环,则仅设置上一个循环中考虑的last 节点的.next 指针,以在元素之间建立适当的链接。

    这是作业吗?也许 Java LinkedList 在内部做了类似的事情。如果这不是家庭作业,更好的方法是使用 Java Collection 框架中的现有解决方案,例如subList 方法。

    【讨论】:

    • 是的,它必须与单独设置last = newNodelast.next = newNode 相同。最好的办法是在程序中附加一个 Java 调试器,它在所有 IDE(如 Netbeans、Eclipse、IntelliJ 社区)中都可用,这将迅速简化开发。
    【解决方案2】:
    if (last == null) {
        last = newList.head = newNode;
    } else {
        last = last.next = newNode;
    }
    
    • 如果 last 为 null,则将 newList.head 设置为 newNode,然后将 last 设置为 newNode

    • 如果 last 不为 null,则将 last.next 设置为 newNode,然后将 last 设置为 newNode

    每次迭代都会创建newNode = new Node() 并将newNode.data 分配给travel.data

    假设迭代 1 创建 Node1,迭代 2 创建 Node2。

    在返回的结构中,Node1.next 必须是 Node2。

    当我们在迭代 2 中时,我们已经处理了 Node1,但不知道下一步是什么(即 Node1.next 为空)。那么——Node1怎么知道“Node1.next”应该是“Node2”呢?

    这就是这个条件的作用。

    【讨论】:

    • "在返回的结构中,Node1.next需要是Node2.next" -- Node1.next不应该是Node2,而不是Node2.next吗?
    • @stackofhay42 是的!谢谢 - 已更正。还明确了项目符号列表中的分配顺序。
    猜你喜欢
    • 2018-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-17
    • 2011-03-19
    • 2020-03-01
    • 1970-01-01
    • 2013-09-20
    相关资源
    最近更新 更多