2012-07-29 273 views
3

我正在C++中進行練習,我正試圖理解如何從列表中移除一個元素,並將其餘部分移到左側。我想知道是否有一個整潔的解決方案。這裏是我的版本,似乎做的工作,但我有一種感覺,有一種更好的方法:從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

你有兩個問題在這。

  1. 您沒有返回已移除的元素,而是用下一個元素覆蓋並返回該元素。我不認爲這是你的意圖。
  2. 你的循環範圍不對。使用此循環,當n = size()時,您將通過索引n + 1的數組邊界。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(); 
    } 
} 
1

如果你這樣做,你沒有正確地實現列表。列表應具有用於移除元素的複雜度O(1)。這看起來更像是一個數組或向量。

一個列表通常由相互關聯的節點組成,在這種情況下,您只需要刪除相關節點,並使前一個節點指向要刪除的節點之後的節點。

+2

列表不需要是鏈接列表。使用數組作爲後端結構是可以接受的。 – 2012-07-29 18:59:07

+1

即使假設'List'只能表示一個鏈表(爲什麼,[skiplist](http://en.wikipedia.org/wiki/Skiplist)或[arraylist](http:// en.wikipedia.org/wiki/Arraylist)?)由於O(n)查找,鏈表不會因爲任意元素而刪除O(1)。 – Grizzly 2012-07-29 19:02:56

+0

@Grizzly是的,但我假設你已經有一個指向正在被刪除的節點的指針。在這種情況下,它將是'begin()+ n'。 – 2012-07-29 19:03:39