如何比较链表中存储的整数-Java

如何比较链表中存储的整数-Java,java,linked-list,compare,Java,Linked List,Compare,我正在寻找一些关于Java作业的建议。我要做的是对存储在链表中的数字执行不同的操作,每个数字在一个单独的节点中。关键是要编写一个程序,可以对非常大的数字进行算术运算 我正在寻找帮助的一个特殊问题是编写一个比较两个数字的方法,类似于用于int的常规compareTo()方法。如果this.numnum,则返回+1;如果它们相等,则返回0 让我感到困难的是,任务规定链表应该以相反的顺序存储数字。例如,编号145的链接列表如下所示: 5=>4=>1=>null 这使得把数字加在一起更容易,但当我试图比

我正在寻找一些关于Java作业的建议。我要做的是对存储在链表中的数字执行不同的操作,每个数字在一个单独的节点中。关键是要编写一个程序,可以对非常大的数字进行算术运算

我正在寻找帮助的一个特殊问题是编写一个比较两个数字的方法,类似于用于int的常规compareTo()方法。如果this.numnum,则返回+1;如果它们相等,则返回0

让我感到困难的是,任务规定链表应该以相反的顺序存储数字。例如,编号145的链接列表如下所示:

5=>4=>1=>null

这使得把数字加在一起更容易,但当我试图比较时,这让我头疼。下面是我想到的,这些评论解释了它应该如何工作

public int compareTo(LLNum list)
{ // Compares two numbers.
  // If the two numbers are of a different length, clearly the shortest is the smallest.
  // If the two numbers are of equal length, call traverseToCompare to do the comparison.
  if (this.len > list.len)
  {
    compareResult = 1;
  }
  else if (this.len < list.len)
  {
    compareResult = -1;
  }
  else if (this.len == list.len)
  {
    traverseToCompare(this.head, list.head);
  }

  return compareResult;
}


public void traverseToCompare(ListNode node1, ListNode node2)
{ // In the case that both numbers are of the same length, recursively traverse the list.
  // compare each digit individually while unwinding the stack.
  // Once two digits are found to be different, break out of the unwinding (Note: I could not find a way of breaking out)
  // Since the dominant digit is at the tail end, this ensures the least number of   comparisons.
  if (node1 == null || node2 == null) 
  { // Base case. Handles the case where both numbers are identical.
    compareResult = 0;
    return;
  }
  traverseToCompare(node1.getNext(), node2.getNext());
  if (node1.getItem() > node2.getItem())
  {
    compareResult = 1;
  }
  if (node1.getItem() < node2.getItem())
  {
    compareResult = -1;
  }

  return; 
}
public int compareTo(LLNum列表)
{//比较两个数字。
//如果两个数字的长度不同,显然最短的是最小的。
//如果两个数字长度相等,则调用traverseToCompare进行比较。
if(this.len>list.len)
{
比较结果=1;
}
else if(this.lennode2.getItem())
{
比较结果=1;
}
if(node1.getItem()
相反顺序的数字是促使我走向递归的原因。我想我会递归地遍历列表,然后比较每个数字,然后在不相同的第一个数字处以某种方式打破递归。我意识到这不是一种使用递归的常用方法,但我不知道还有什么其他方法可以做到。有没有一种方法可以在不抛出异常的情况下中断?我觉得这可能有点太草率了。或者有没有关于如何在没有递归的情况下做到这一点的建议


请不要只是给我一些代码来复制和粘贴。我只是想被指向正确的方向。谢谢

如果必须这样做,我会首先检查两个列表的长度(就像您所做的那样)。如果它们相等,比较的更好方法是为每个列表创建一个迭代器。然后可以同时递增迭代器,并比较链表中该位置的值。这样做,一旦确定一个列表包含的数字大于另一个,您就可以停止比较列表。

最好的方法是遍历每个数字的列表,构造数字,然后比较这两个数字

从列表中构造数字的方法是

int i = 0
int f = 1
Do while GetNext() <> Null
    i = i + GetCurrentItem() * f
    f = f * 10
End Do

因此,i=145。

使用普通字符串会容易得多;因为您可以存储任意长度的数据。但无论如何,对LinkedList的要求是:

现在,数据以相反的顺序存储;这意味着您在浏览完整列表之前无法决定
compareTo
方法的响应,因为最重要的数据存储在最后一个位置

  5 --> 4  --> 1    == 145
  1 --> 4 --> 5     == 541
因此,至少要通读全部内容;然后可以将值存储在字符串中,然后决定
比较方法结果

对相同长度的项调用traverseToCompare方法。因此,您可以编写自己的算法来比较存储在字符串中的两个数字

编辑 如果字符串是不允许的


然后会建议你手动做同样的事情;遍历整个列表,比较最后一个节点,如果最后一个节点相同,则比较上一个节点,依此类推……

在traverseToCompare中,您需要注意一些情况。 如果不使用递归,它会更好、更干净。 下面是一个解决方案

boolean areSame = true;
boolean digitDiffer = false;
int compareResult = 0;
int length = node1.length
for(int i=0; i<length; i++)
{
   if(!digitDiffer && ((node1.getItem() == node2.getItem()))
   {
     continue
   }
   else
   {
      digitDiffer = true;
      if(node1.getItem() >= node2.getItem())
      {
         compareResult = 1
      }
      else
      {
        compareResult = -1;
      }
   }
}

return compareResult;
boolean arame=true;
布尔数字差=假;
int compareResult=0;
int length=node1.length
for(int i=0;i=node2.getItem())
{
比较结果=1
}
其他的
{
比较结果=-1;
}
}
}
返回比较结果;

当它溢出时会发生什么?我很确定这是作业要点的一部分,因此肯定会被测试。我应该指定,我们不允许使用字符串:然后你必须做一些更脏的工作:D。在编辑部分更新。考虑到数字存储顺序相反,有没有办法做到这一点?使用双链接列表很容易,但我们必须使用单链接列表。我想检查的第一个数字是尾部,我确实有一个参考,但我不确定如何从尾部向后移动。哦,我看到了问题。我认为Rai的答案是正确的。我看到你说你不能使用字符串。在这种情况下,您真正拥有的唯一选择是每次完全遍历列表。节省的好处是,您可以跟踪每次迭代的距离(因为每次执行比较时,您都必须迭代较少的一个元素)。当然,如果你发现一个列表比o大
boolean areSame = true;
boolean digitDiffer = false;
int compareResult = 0;
int length = node1.length
for(int i=0; i<length; i++)
{
   if(!digitDiffer && ((node1.getItem() == node2.getItem()))
   {
     continue
   }
   else
   {
      digitDiffer = true;
      if(node1.getItem() >= node2.getItem())
      {
         compareResult = 1
      }
      else
      {
        compareResult = -1;
      }
   }
}

return compareResult;