3

我正在使用 C++ 进行练习,我试图了解如何从列表中删除一个元素并将其余元素移到左侧。我想知道是否有一个简洁的解决方案。这是我的版本,它似乎可以完成这项工作,但我觉得有更好的方法:

Account AccountList::remove(int i){
if(i>=0 && i<size()) {
    for (int n = i; n < size(); n++) {
        if(i+1!=size()) {
            aList[n]=aList[n+1];
        }
    }
    sz--;
    return aList[i];
} else {
    return Account();
}
}
4

2 回答 2

4

你有两个问题。

  1. 您不会返回已删除的元素,而是用下一个元素覆盖它并返回那个元素。我不认为这是你的意图。
  2. 您的循环范围不正确。使用此循环,当 n = size() - 1 时,您将越过索引为 n+1 的数组边界

下面给出更正后的。

Account AccountList::remove(int i)
{
  if(i>=0 && i<size()) 
  {
    Account a = aList[i]
    for (int n = i; n < size() - 1; n++) 
    {
        if(i+1!=size()) 
        {
            aList[n]=aList[n+1];
        }
    }
    sz--;
    return a;
  } else 
  {
    return Account();
  }
}
于 2012-07-29T18:59:52.190 回答
1

如果您这样做,则说明您没有正确实施该列表。列表应该具有O(1)删除元素的复杂性。这看起来更像是一个数组或向量。

列表通常由相互链接的节点组成,在这种情况下,您只需删除有问题的节点,并使前一个节点指向您要删除的节点之后的节点。

于 2012-07-29T18:57:44.653 回答