集合遍歷時刪除和增加元素

2021-09-30 06:30:07 字數 3560 閱讀 3892

大多數時候,遍歷集合元素的時候並不需要對元素進行增加或者刪除操作,但有些時候則需要,比如,如果集合中盛放的元素是社會上所有的人,那麼有人死亡則元素刪除,有人出生則是集合元素的增加。對於這種情況,遍歷不能按照原來那種方式去做了,而且c#中的集合對於這類有增刪動作的遍歷,也不支援foreach迴圈。

有三種辦法可以解決這一問題。

第一種方法:使用c#的linkedlist<>雙鏈表。我原來設想,把原來鍊錶需要刪除的元素直接remove掉,那些新新增的元素,先裝入到乙個臨時鍊錶中,等迴圈結束,再用add把臨時鍊錶的頭結點新增到原來鍊錶的尾部即可,這樣演算法的複雜度也較低,但是,出乎意料的是,c#的雙鏈表,無法將屬於另外乙個鍊錶的結點新增到本鍊錶中,其next屬性也唯讀。無奈,只能一邊迴圈,一邊在原鍊錶尾端新增結點,這樣就需要標記處迴圈結束的位置,即需要在原來的未改動的鍊錶的尾部結點處結束迴圈,而不是在改動後的鍊錶的尾部結點處結束。這樣就要求在迴圈開始之前,先獲得尾部結點的引用。程式如下(鍊錶中有0-29的整數值結點,遍歷時遇到3的整數倍,就在鍊錶尾端新增乙個0值結點,遇到2的整數倍就刪除結點)

view plaincopy to clipboardprint?

using system;  

using system.collections.generic;  

using system.componentmodel;  

using system.data;  

using system.drawing;  

using system.linq;  

using system.text;  

using system.windows.forms;  

namespace 集合遍歷時刪除或增加元素  

private linkedlistlist = new linkedlist();  

//初始化,新增0-29的整數進入鍊錶  

private void button1_click(object sender, eventargs e)  

}  

//遍歷鍊錶,做如下操作:  

//遇到能被3整除的,就在該鍊錶後增加乙個0元素,遇到能被2整除的就刪除該元素  

private void button2_click(object sender, eventargs e)  

//如果能被2整除,則刪除該元素  

if (nodenow.value % 2 == 0)  

else 

}  

//最後不要忘記對nodelast(原鍊錶最後乙個元素)本身進行處理,上面的while迴圈沒有包括這個nodelast  

if (nodenow.value % 3 == 0)  

if (nodenow.value % 2 == 0)  

}  

//測試結果  

private void button3_click(object sender, eventargs e)  

}  

}  

}  using system;

using system.collections.generic;

using system.componentmodel;

using system.data;

using system.drawing;

using system.linq;

using system.text;

using system.windows.forms;

namespace 集合遍歷時刪除或增加元素

private linkedlistlist = new linkedlist();

//初始化,新增0-29的整數進入鍊錶

private void button1_click(object sender, eventargs e)

}//遍歷鍊錶,做如下操作:

//遇到能被3整除的,就在該鍊錶後增加乙個0元素,遇到能被2整除的就刪除該元素

private void button2_click(object sender, eventargs e)

//如果能被2整除,則刪除該元素

if (nodenow.value % 2 == 0)

else

}//最後不要忘記對nodelast(原鍊錶最後乙個元素)本身進行處理,上面的while迴圈沒有包括這個nodelast

if (nodenow.value % 3 == 0)

if (nodenow.value % 2 == 0)

}//測試結果

private void button3_click(object sender, eventargs e)}}

}第二種方法:使用c#的list<>,list<>是基於陣列的順序表,增加、刪除動作時間複雜度較高,不如鍊錶的效率高。其基本原來同第一種方法相似,也需要使用乙個int型的變數標記原順序表的尾部元素,當刪除乙個元素時,這個變數需要自減。**略。

第三種方法,自定義單鏈表泛型類(鍊錶類見跟第一種方法比的好處,就是能夠靈活實現兩個鍊錶的合併,只需要把第二個鍊錶的頭結點設定成第乙個鍊錶的尾結點的next的結點(或直接add)就可以了。其實對於c#的雙鏈表,我並不是很清楚,為什麼addlast()方法,無法將乙個鍊錶的元素新增到另乙個鍊錶中,而只能新增乙個不屬於任何鍊錶的結點(有人說第一種方法,其實可以使用結點clone,但是這樣無非還是增加演算法的空間和時間複雜度,違背了使用鍊錶的本意)。c#之所以不支援這種做法的原因可能是,ms擔心你加入的結點,位於乙個環狀鍊錶上,這樣會導致原鍊錶的last屬性、count屬性等無法計算(形成死迴圈)。測試**如下:

view plaincopy to clipboardprint?

//兩個鍊錶的合併  

linkedlistlist = new linkedlist();  

for (int i = 0; i < 10; i++)  

linkedlistlist2 = new linkedlist();  

for (int i = 10; i < 20; i++)  

list.add(list2.head);  

noden = list.head;  

while(n!=null)  

console.readline();  

console.writeline(list.getlength());  

console.readline(); 

//兩個鍊錶的合併

linkedlistlist = new linkedlist();

for (int i = 0; i < 10; i++)

linkedlistlist2 = new linkedlist();

for (int i = 10; i < 20; i++)

list.add(list2.head);

noden = list.head;

while(n!=null)

console.readline();

console.writeline(list.getlength());

console.readline();

JQuery的增加元素,刪除元素

let div elm elm 可以建立乙個div元素,並內容為elm prepend 方法會把元素新增到匹配元素最前面,類似原生js裡的insertbefore 內部新增元素後,生成的是父子關係 原來的 before 方法會把元素新增在匹配元素前面 原來的 after 方法會把元素新增在匹配元素後...

numpy刪除,插入,增加元素

刪除 numpy.delete arr,obj,axis none arr 輸入向量 obj 表明哪乙個子向量應該被移除。可以為整數或乙個int型的向量 axis 表明刪除哪個軸的子向量,若預設,則返回乙個被拉平的向量 a np.array np.arange 12 reshape 3,4 arra...

STL容器遍歷時刪除元素

stl容器遍歷時在迴圈體內刪除元素最容易出錯了,根本原因都是因為迭代器有效性問題,在此記下通用刪除方法,該方法適用於所有含erase成員函式的序列容器 1 std vectormyvec 23 std vector iterator it myvec.begin 4while it myvec.en...