我正在尝试编写一个方法,该方法接受整数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”节点,该节点用于遍历当前列表。另外,我相信“ last”就可以跟踪当前对象中的最后一个节点。
我也了解while循环的第一部分;但是,我不明白为什么有条件
if (last == null)
last = newList.head = newNode;
else last = last.next = newNode;
存在。第一次执行代码时,节点“ last”为null,因此在第一次迭代中,我猜测我们会将newNode设置为新列表的开头。但是为什么我们还要最后更新呢?这是否意味着“ last”正在跟踪新列表中的最后一个节点?我也不知道“ else”语句在做什么。
我在n = 2的列表{1,2,3}中进行了跟踪。但是,我仍然不太了解它。 while循环的其余部分(在此条件之后)对我来说很有意义。
答案 0 :(得分:1)
if (last == null) {
last = newList.head = newNode;
} else {
last = last.next = newNode;
}
如果last为空,请将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为null)。那么-Node1如何知道“ Node1.next”应该是“ Node2”?
这就是这个条件。
答案 1 :(得分:1)
您需要使用的对象似乎是一个链接列表,即每个node
都引用了列表中的下一个node
。一个节点是特殊的,称为head
。这样可以迭代从开始head
到结尾(当.next
为null
时)的所有元素。在第一次迭代期间,必须将此head
设置为在列表中具有某些内容,以便以后进行迭代。当last
为null
时,while循环将首次执行。如果这不是第一个循环,则仅设置上一个循环中考虑的.next
节点的last
指针,以在元素之间具有正确的链接。
这是家庭作业吗?也许Java LinkedList
在内部做了类似的事情。如果这不是一项家庭作业,那么更好的方法是使用Java Collection框架中的现有解决方案,例如subList
方法。