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

时间:2019-04-04 00:24:22

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

我正在尝试编写一个方法,该方法接受整数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循环的其余部分(在此条件之后)对我来说很有意义。

2 个答案:

答案 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到结尾(当.nextnull时)的所有元素。在第一次迭代期间,必须将此head设置为在列表中具有某些内容,以便以后进行迭代。当lastnull时,while循环将首次执行。如果这不是第一个循环,则仅设置上一个循环中考虑的.next节点的last指针,以在元素之间具有正确的链接。

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