Java 交换周围的循环链表节点
基本上,我必须将循环链表中的一组节点移动到同一链表中的不同位置Java 交换周围的循环链表节点,java,Java,基本上,我必须将循环链表中的一组节点移动到同一链表中的不同位置 prev ptr [1] -->[2]-->[3]-->[4] 可以更容易地将该操作视为两个不同的操作。先移除,然后插入 // remove the node Node node = ...; // whatever identifies the node to operate on prev(node).setNext(next(node)); // insert it into its new position
prev ptr
[1] -->[2]-->[3]-->[4]可以更容易地将该操作视为两个不同的操作。先移除,然后插入
// remove the node
Node node = ...; // whatever identifies the node to operate on
prev(node).setNext(next(node));
// insert it into its new position
Node newPrev = ...; // whatever identifies the node to operate on
Node newNext = newPrev.next();
newPrev.setNext(node);
node.setNext(newNext);
请注意,enonu的方法在某些特殊情况下不起作用,例如一个节点紧挨着另一个节点,或者两个节点都指向同一个节点 下面的方法通过观察PA(A的前身和B的后继节点)来交换两个节点A和B。首先,我们删除A和B,然后插入SB的左侧,最后插入PA的右侧。在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;
}
这正是我要建议的。然后,当然,这些操作应该封装在它们自己的函数中,这些函数看起来像
llRemove(LIST*LIST,NODE*NODE)
和'llAdd(LIST*LIST,NODE*NODE,NODE*after)`