从单链接列表中提取前n个元素

问题描述 投票:0回答:2

我正在尝试编写一个接受整数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;
}

我知道该方法首先声明一个新列表。从那里,它声明了“travel”节点,用于遍历当前列表。此外,我相信“最后”就是跟踪当前对象中的最后一个节点。

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

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

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

我已经通过列表{1,2,3}跟踪了n = 2.但是,我仍然无法理解它。 while循环的其余部分(在此条件之后)对我有意义。

java linked-list singly-linked-list
2个回答
1
投票

你必须使用的对象似乎是一个链表,即每个node都有一个对列表中下一个node的引用。一个节点是特殊的,称为head。这允许迭代从head开头到结尾的所有元素(当.nextnull时)。在第一次迭代期间,必须将此head设置为在列表中具有某些内容以便稍后迭代。当lastnull时,while循环第一次执行。如果这不是第一个循环,那么只需设置前一个循环中考虑的.next节点的last指针,以便在元素之间进行正确的链接。

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


1
投票
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

假设Iteration 1创建Node1,Iteration 2创建Node2。

在返回的结构中,Node1.next需要是Node2。

当我们处于迭代2时,我们已经处理过Node1而不知道接下来是什么(即Node1.next为null)。那么 - Node1如何知道“Node1.next”应该是“Node2”?

这是条件的作用。

© www.soinside.com 2019 - 2024. All rights reserved.