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)`