我正在处理一段C#代码,它添加了存储在单链表中的数字。我创建了一个包含11 11 8的缓冲区单链表。最终名单必须看起来像1 2 9。每个大于10的元素必须将转移传递给下一个数字,并且%10的结果将传递到将创建1 2 9的最终列表。 如何处理从左到右开始的每个数字的结转?
我创造了以下逻辑,但显然我忽略了一些东西。
for (int i = 0; i < bufferList.Size(); i++)
{
int mostLeftValue = Convert.ToInt32(bufferList.GetValue(i));
if (mostLeftValue >=10 && i + 1 < bufferList.Size())
{
int nextLeftValue = Convert.ToInt32(bufferList.GetValue(i + 1))+1;
int modedNextValue = nextLeftValue % 10;
finalList.InsertAtTail(modedNextValue);
}
int moddedValue = mostLeftValue %10 ;
finalList.InsertAtFront(moddedValue);
答案 0 :(得分:1)
看起来你不会将任何从一个值带到另一个值。此外,您正在添加输出列表的两端,这似乎是可疑的。
这是一个简单List<int>
的实现 - 它基本上是你手动添加两个数字时所做的,只是没有实际添加。取当前数字,添加携带号码,存储“单位”,将“十位”带到下一栏。
Number 11 11 8
Carry 0 ┌─ 1 ┌─ 1 ┌─ 0
Sum 11 │ 12 │ 9 │
Store 1 │ 2 │ 9 │ stop
Carry over 1 ─┘ 1 ─┘ 0 ─┘
您应该可以针对链接列表([i] -> .GetValue(i)
,.Add -> .InsertAtTail
,.Count -> .Size()
或类似名称)对其进行修改:
int carry = 0;
for (int i = 0; i < input.Count; i++)
{
int sum = carry + input[i]; // add previous carry
output.Add(sum % 10); // store the "units"
carry = sum / 10; // carry the "tens"
}
while (carry > 0) // anything left carried?
{
output.Add(carry % 10); // store the "units"
carry = carry / 10; // carry the "tens"
}