注意enonu的做法並不在某些特殊情況下工作,如果一個結點是旁邊的其他,或者它們指的是同一節點等。
以下方法通過觀察在P交換兩個節點A和B 甲,A和S 乙的前身,B.第一的後繼者,除去A和B,然後我們插入S的左 B最後B的右側P A。在A是B的後繼者的特殊情況下,我們使用交換的參數重新啓動。如果兩者都是彼此的繼承者,我們什麼也不做。
private void swap(Node a, Node b) {
if (a.pred == b) {
if (b.pred != a)
swap(b, a);
return;
}
Node pa = a.pred, sb = b.succ;
// remove a from list
pa.succ = a.succ;
pa.succ.pred = pa;
// remove b from list
sb.pred = b.pred;
sb.pred.succ = sb;
// add a before sb
a.pred = sb.pred;
a.succ = sb;
a.pred.succ = a;
a.succ.pred = a;
// add b after pa
b.succ = pa.succ;
b.pred = pa;
b.pred.succ = b;
b.succ.pred = b;
}
來源
2014-06-18 11:20:06
fuz
這就是我正在建議的。然後,當然,這些操作應該被包裝在自己的函數中,看起來像`llRemove(LIST * list,NODE * node)`和'llAdd(LIST * list,NODE * node,NODE *)` – 2011-02-11 06:49:10