是否有一组通用指令来交换链表中相邻和不相邻的记录?`

Is there a general set of instructions to swap adjacent and non-adjacent records in a linked list?`

对于单向链表,交换不相邻的单元格可以通过以下操作来描述,假设'=>'表示'now links to':

Y => X->next
X => Y->next
BeforeY => X
BeforeX => Y

但是,此操作不适用于交换相邻记录,创建循环链接,因为 X->next(比方说)将是 Y。

相邻记录交换,假设 X 在 Y 之前,可以用一组单独的操作来描述:

X => Y->next
Y => X
BeforeX => Y

我似乎无法将这组操作作为前一组的子集或父集的普通子集来解决。

是否有一组统一的、无条件的操作来描述适用于相邻和非相邻记录的交换?

这是两种场景的一些 ASCII 艺术。

不相邻的 X 和 Y

只要X和Y之间至少有一个元素,X在列表中可以在Y之前或之后(这样当X在Y之前时,Ax和By可以标识同一个节点)。之前的情况:

     Bx       X        Ax           By       Y        Ay

   +----+   +----+   +----+       +----+   +----+   +----+   
   |    |   |    |   |    |       |    |   |    |   |    |   
-->|    |-->|    |-->|    |--...->|    |-->|    |-->|    |-->
   |    |   |    |   |    |       |    |   |    |   |    |   
   +----+   +----+   +----+       +----+   +----+   +----+   

之后的情况:

     Bx       X        Ax           By       Y        Ay
                   +------------------------------+
                   |                              |
          +------------------------------+        |
          |        |                     |        |
   +----+ | +----+ | +----+       +----+ | +----+ | +----+   
   |    |-+ |    |-+ |    |       |    | +>|    | +>|    |
-->|   @|   |   @|   |    |--...->|   @|   |   @|   |    |-->
   |    | +>|    | +>|    |       |    |-+ |    |-+ |    |
   +----+ | +----+ | +----+       +----+ | +----+ | +----+   
          |        |                     |        |
          +------------------------------+        |
                   |                              |
                   +------------------------------+

标记为@的4个'next'指针已更改。

之前:

Bx->next = X
X->next  = Ax
By->next = Y
Y->next  = Ay

之后:

Bx->next = Y
Y->next  = Ax
By->next = X
X->next  = Ay

相邻的 X 和 Y

假设X紧接在Y之前。之前的情况:

     Bx         X          Ax
                By         Y          Ay

   +----+     +----+     +----+     +----+
   |    |     |    |     |    |     |    |
-->|    |---->|    |---->|    |---->|    |-->
   |    |     |    |     |    |     |    |
   +----+     +----+     +----+     +----+

之后的情况:

     Bx         X          Ax
                By         Y          Ay
                                   
          +------------+
          |            |
   +----+ |   +----+   | +----+     +----+
   |    |-+   |    |   +>|    |     |    |
-->|   @|     |   @|     |   @|     |    |-->
   |    |   +>|    |-+   |    |-+ +>|    |
   +----+   | +----+ |   +----+ | | +----+
            |        |          | |
            +-------------------+ |
                     |            |
                     +------------+

之前:

Bx->next = X
X->next  = Ax = Y
By->next = Y
Y->next  = Ay

之后:

Bx->next = Y
Y->next  = X        # Different
By->next = Ay       # Different
X->next  = Ay

指针中的结果值不同,如图所示。这意味着没有一个映射同时适用于“不相邻的 X 和 Y”和“相邻的 X 和 Y”的情况——指针旋转必须不同。