是否有一组通用指令来交换链表中相邻和不相邻的记录?`
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”的情况——指针旋转必须不同。
对于单向链表,交换不相邻的单元格可以通过以下操作来描述,假设'=>'表示'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”的情况——指针旋转必须不同。