【问题标题】:How to compare a number in LinkedList using Iterator如何使用迭代器比较 LinkedList 中的数字
【发布时间】:2018-12-15 11:31:30
【问题描述】:

我有两个链表,每个链表代表一个数字。 例如列表 1 代表数字 29,第二个代表数字 7。 我想为这两个链表实现运算符 less equal ,其工作方式如下: 如果第一个链表表示的数字小于第二个,则返回 true。如果不返回false。 最重要的是只检查一次每个链表。所以使用链表中定义的 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 在当前链表的第三个链接中。

【问题讨论】:

  • 你首先需要决定当两个列表大小不同时你的代码应该做什么。我们不能为你决定。它应该抛出异常吗?只迭代直到找到最短列表的末尾?总是返回false?总是返回 true?如果第一个列表较短,则返回 true?我们怎么知道?
  • @JohnD 只有一次,但如果一个比另一个短怎么办?
  • @Dici 如果第一个比另一个短,那么它应该返回 true,因为较短的数字总是小于较长的数字。
  • 那就这样做吧。在进入循环之前,检查一个是否比另一个短并立即返回。然后才开始你的循环。
  • @JBNizet 我已经用更多细节更新了原始帖子。但是对于问题 - 我总是对第一个链表做一个小于运算符。如果第一个比其他短,它应该返回 true。如果第一个比其他长,它应该返回 false。

标签: java linked-list iterator


【解决方案1】:

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

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

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

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

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

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

  • 迭代两个列表,直到到达任何列表的末尾(我已经为您提供了条件)。

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

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

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

【讨论】:

    猜你喜欢
    • 2020-04-10
    • 2021-12-04
    • 2018-05-31
    • 1970-01-01
    • 1970-01-01
    • 2019-02-20
    • 2012-03-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多