我正在尝试编写一个接受整数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循环的其余部分(在此条件之后)对我有意义。
你必须使用的对象似乎是一个链表,即每个node
都有一个对列表中下一个node
的引用。一个节点是特殊的,称为head
。这允许迭代从head
开头到结尾的所有元素(当.next
是null
时)。在第一次迭代期间,必须将此head
设置为在列表中具有某些内容以便稍后迭代。当last
是null
时,while循环第一次执行。如果这不是第一个循环,那么只需设置前一个循环中考虑的.next
节点的last
指针,以便在元素之间进行正确的链接。
这是作业吗?也许Java LinkedList
在内部做了类似的事情。如果这不是家庭作业,更好的方法是使用Java Collection框架中的现有解决方案,例如subList
方法。
if (last == null) {
last = newList.head = newNode;
} else {
last = last.next = newNode;
}
newList.head
设置为newNode
,然后将last
设置为newNode
。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”?
这是条件的作用。