簡體   English   中英

如何交換列表中的元素?

[英]How do I swap elements in a List?

我正在嘗試自己學習數據結構和算法。 我用 C 編寫了自己的雙鏈表,現在我想編寫一些算法來在列表上執行。 交換列表項的首選方法是什么? 是交換內容還是重新排列指向下一個和上一個列表項的指針更好?

重新排列指針。 交換數據項可能會產生副作用。 特別是,您可能已經在函數之外的某處存儲了對某個節點的引用,並且通常當您重新排列列表中節點的順序時,您不希望持有對某個節點的引用的人突然發現該節點指向到新數據。 那是因為通常節點的重要標識特征是它指向的數據,而不是它在列表中的位置。

規范交換是通過指針重新排列完成的,沒有副作用,當然更快:

void swap (node *a, node *b) {
    node *tmp;

    tmp = a;
    a = b;
    b = tmp;
}

根據存儲在鏈表元素中的內容類型,交換元素的實際內容會很棘手(例如考慮不同長度字符串的鏈表),因此交換指向的指針更容易下一個和上一個列表項。

取決於您如何分配內容。

如果您要存儲指向內容的指針,那么切換內容就沒什么大不了的。 如果您的節點中有一個很大的結構,那么切換指針可能比復制整個內容更有效。

我傾向於支持大多數人已經說過的。 一些背景知識可能會有所幫助:交換指針可以保證工作,而交換對象可能並不總是像看起來那么簡單。 想想可能/將要創建的臨時對象和異常(我的意思是一般而言,而不是 C++ 語言功能方式)可能會發生並且實際上使您的容器(列表)處於不良狀態。 在您的容器中尋找不變量——也就是說,交換應該保持列表大小不變,元素不變並在其上進行設計。

是交換內容還是重新排列指向下一個和上一個列表項的指針更好?

重新排列指針,因為交換節點的所有元素可能要昂貴得多。

就時間復雜度而言,交換兩個指針是常量操作。

但是,如果您想在兩個節點之間交換所有元素,那么您需要訪問它們,並將它們與對應的元素交換,即 O(f),其中 f 是表示節點的結構體的字段數擁有(即節點擁有的數據數量)。

換句話說,交換節點數據是一個線性操作,而交換兩個指針是一個常數。


交換數據可能會產生副作用,尤其是當您可能在函數之外的某處存儲了對某個節點的引用時,這已在已接受的答案中涵蓋,但我也想指出這一事實。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM