首页 > 解决方案 > 如何使用迭代器比较 LinkedList 中的数字

问题描述

我有两个链表,每个链表代表一个数字。例如,列表 1 表示数字 29,第二个表示数字 7。我想为这两个链表实现运算符 less equal,其工作方式如下:如果第一个链表表示的数字小于第二个返回 true。如果不返回false。最重要的是只检查一次每个链表。所以使用在linkedlist 中定义的size & get 方法是没有用的。

当链表表示的两个数字具有不同的长度大小时,我面临的问题。例如 10?1 应该返回 false。为 1?10 它应该返回 true 并且还返回 10 ?10. 每个数字由一个链表表示。

我想通过迭代器遍历一个或两个链表,以了解第一个链表表示的数字是否小于另一个。

我写了一个代码,它只在数字表示相同长度时才有效,例如 29?45还是7?6等

    Iterator<T> iter1 = a1.Iterator();
    Iterator<T> iter2 = a2.Iterator();
    while (iter1.hasNext()) {
        if (!(iter1.next().lessEqual(iter2.next()))) //if iter2 !hasNext this will throw exception; for ex 1?10
            return false;
    }
    return true;

我如何实现以链表表示的不同大小的数字来修复它?请注意,整数中的每个数字都在链接中分配。例如 294。数字 2 在当前链表的第一个链接中,9 在第二个链接中,4 在当前链表的第三个链接中。

标签: javalinked-listiterator

解决方案


为避免抛出异常,您需要更改循环条件:

while (iter1.hasNext() && iter2.hasNext()) {

然而,这还不足以让你的程序给出正确的答案,因为你需要做更多的工作。

假设没有前导零,请注意:

  • 如果一个数字的位数少于另一个,则数字越短越小
  • 如果两个数字的位数相同,则第一个不同的数字决定哪个更小

LinkedList如果您从标准库中使用,上述内容应该很容易实现,因为它有一种size()方法可以检查长度而无需迭代元素。如果您不能使用LinkedList并且无法在恒定时间内获得列表的大小,那么您需要更加努力。考虑以下实施步骤:

  • 迭代这两个列表,直到到达任何列表的末尾(我已经给了你条件)。

  • 在每次迭代中,比较数字:如果发现差异,则将其保存以备后用,并且不要在循环中再次覆盖它。例如,您可以使用 a Boolean firstIsSmaller,初始化为null,并设置为trueorfalse当找到第一个不同的数字时,否则一直停留null到循环结束。

  • 在循环结束时,如果列表之一没有到达末尾,则该列表是较大的数字。

  • 如果两个列表同时到达末尾,则使用firstIsSmaller来决定哪个数字更小。当firstIsSmallernull,这意味着没有发现差异,数字是相等的。否则布尔值决定第一个是否更小。


推荐阅读