当前位置: 首页 > 知识库问答 >
问题:

是否有一套通用的指令来交换链表中相邻和非相邻的记录?'

鄂伟兆
2023-03-14

对于单链表,交换非相邻单元格可以通过以下操作来描述,假设'=

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

但是,该操作不适用于交换相邻记录、创建循环链接,如X-

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

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

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

是否有一套统一的、无条件的操作来描述对相邻和非相邻记录都有效的交换?

共有1个答案

冀啸
2023-03-14

下面是这两个场景的一些ASCII艺术。

只要X和Y之间至少有一个元素,X就可以出现在列表中Y的前面或后面(因此当X出现在Y之前时,Ax和By可以识别同一个节点)。以前的情况:

     Bx       X        Ax           By       Y        Ay

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

之后的情况:

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

标记为@的4个“下一步”指针已更改。

之前:

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之前。

     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”情况——指针旋转必须不同。

 类似资料:
  • 类MyList的公共方法TwoTogethere()返回True,当且仅当list有两个相等的相邻元素。您可以假定没有列表元素(数据)为空。以下是一些示例:当调用此方法时,列表[a,b,c,d]将返回false。而是一个清单[a、b、b、c]或[a、b、c、d、e、f、f]。方法返回true。编写public方法。您可以使用列表接口引用(字段:data、prev、next)(head、tail)(

  • 这个 邻接列表 模式是一种常见的关系模式,通过该模式,表包含对其自身的外键引用,换言之,是 自指关系 。这是在平面表格中表示分层数据的最常见方式。其他方法包括 嵌套集 ,有时称为“修改的预购”,以及 物化路径 。尽管在评估SQL查询内的流畅性时,修改的预排序很有吸引力,但由于并发性、降低复杂性的原因,邻接列表模型可能是最适合大多数分层存储需求的模式,而且与可以将子树完全加载到应用程序空间的应用程序

  • 问题内容: 我根据员工的工作时间做一些报告。在某些情况下,数据包含两个单独的记录,这实际上是一个时间段。 这是该表的基本版本和一些示例记录: 数据: 在该示例中,最后两个记录在时间上是连续的。我想编写一个查询,该查询结合了所有相邻记录,因此结果集是这样的: 理想情况下,它还应该能够处理两个以上的相邻记录,但这不是必需的。 问题答案: 本文为您的问题提供了许多可能的解决方案 http://www.s

  • 问题内容: 我不知道如何很好地解释这一点,所以请多多包涵。 我试图对彼此相邻的相似行进行分组,如果相同,则基本上忽略第n + 1行。我不确定这在MySQL中是否容易实现。这些行除描述外不共享其他任何属性。如果还有其他不重复的“描述”,我仍然希望将它们返回。 我有一张桌子,上面满是这样的条目: 问题答案: 您可以使用巧妙的技巧来做到这一点。诀窍是计算与特定id 不同 的描述的数量。对于序列中的值,此

  • 问题内容: 我有一个程序,该程序每分钟通过PING检查网络中计算机的状态。每次它将向数据库插入新行,如下所示(我使用的是postgresql) 我希望结果如下 如何获得此输出? 问题答案: 这是差距和孤岛的问题。可以解决如下: dbffile演示 关键是最嵌套的子查询,在该子查询中,我使用两个函数来隔离设备上相同状态的连续出现。一旦有了价值,剩下的就很容易了。 结果