链表重载添加

Linked List overload addition

本文关键字:添加 重载 链表      更新时间:2023-10-16

我试图使用链表重载加法,但遇到了麻烦。我将两个链表添加在一起,每个节点都是单独添加的,但如果我添加两个包含999和999的列表,那么它显示的是181818,而不是正确的答案,我有点迷路了。它有时似乎有效,尽管我用500和500。

LinkedList LinkedList::operator+( LinkedList &obj)
{
LinkedList sum;
ListNode *nodePtr;
ListNode *nodePtr2;
nodePtr = head;
nodePtr2 = obj.head;
while (nodePtr && nodePtr2)
{
sum.appendNode(nodePtr->value + nodePtr2->value);//append node adds a new node containing the value at the end of the list.
nodePtr = nodePtr->next;
nodePtr2 = nodePtr2->next;
}
return sum;
}

从您的代码和文章中,每个链表似乎都是一个数字的数字列表。您正试图通过添加两个链表的匹配列表项来添加两个数字。但这至少在两种情况下会很快失败:

  1. 添加的两个元素返回的总和大于10,并且它们位于数字的中间。在这种情况下,你需要"背着一个",正如我们在二年级学到的那样。这将涉及到更多你在这里没有的列表工作
  2. 如果这两个数字的长度不同。while循环将忽略较长数字的额外数字

是的,它适用于500+500——这并不违反我上面提到的两种情况中的任何一种。

所以,我想把你的while循环改成这样:

int carryVal = 0;
while (...) {
...
int sum = nodePtr->value + nodePtr2->value;
int thisDigitVal = sum % 10 + carryVal; // First digit of the sum, plus any carry from previous digit
sum.appendNode(thisDigitVal);
carryVal = sum / 10; // carry for next digit (division by int will truncate -- thats what we want)
...
}

注意事项:

  1. 您可能需要更改while条件,以处理不同长度的数字,并处理任何最终进位
  2. 这只适用于对2个数字求和。对于3或更多,您将不得不处理int thisDigitVal = sum % 10 + carryVal;返回值>9的情况,从而在下一个数字的进位上再加1