问:将双向链表旋转 N 个节点的程序。

2025年3月17日 | 阅读11分钟

说明

在此程序中,我们需要创建一个双向链表并将其旋转 n 个节点。这可以通过维护一个从头节点开始的指针,并遍历列表直到 current 指向第 n 个节点来实现。将从头节点到第 n 个节点的列表移动到尾节点之后。现在第 n 个节点将成为列表的尾节点,第 n 个节点之后的节点将成为新的头节点。这里,n 应该始终大于 0 但小于列表的大小。

原始列表

Program to rotate doubly linked list by N nodes

旋转 3 个节点后的列表

Program to rotate doubly linked list by N nodes

在上面的示例中,我们需要旋转列表 3 个节点。首先,我们遍历列表直到 current 指向第 3 个节点,在本例中是节点 3。将从节点 1 到 3 的列表移到尾节点之后。现在,节点 4 将成为新的头节点,节点 3 将成为新的尾节点。

算法

  1. 定义一个 Node 类,它表示列表中的一个节点。它将有三个属性:数据、previous 指向前一个节点,以及 next 指向下一个节点。
  2. 为创建双向链表定义另一个类,它有两个节点:head 和 tail。最初,head 和 tail 将指向 null。
  3. addNode() 将向列表中添加节点。
    1. 它首先检查头节点是否为 null,然后将节点作为头节点插入。
    2. 头节点和尾节点都将指向新添加的节点。
    3. 头节点的前一个指针将指向 null,尾节点的下一个指针将指向 null。
    4. 如果头节点不为 null,则新节点将插入到列表的末尾,使得新节点的前一个指针将指向尾节点。
    5. 新节点将成为新的尾节点。尾节点的下一个指针将指向 null。
  4. rotateList() 函数将旋转列表 n 个节点。
    1. 首先,检查 n 是否为 0 或大于等于列表中存在的节点数。
    2. 如果是,则按原样打印列表。
    3. 否则,定义一个指向 head 的 current 节点。
    4. 遍历列表直到 current 指向第 n 个节点。
    5. Tail 的 next 将指向 head 节点。
    6. 将 current 之后的节点设为新的 head。Head 的 previous 将指向 null。
    7. current 节点将成为列表的 tail。Tail 的 next 将指向 null。
  5. display() 将显示列表中存在的所有节点。
    1. 定义一个新节点“current”,它将指向头节点。
    2. 打印 current.data 直到 current 指向 null。
    3. 在每次迭代中,current 将指向列表中的下一个节点。

解决方案

Python

输出

Original List: 
1 2 3 4 5 
Updated List: 
4 5 1 2 3 

C

输出

Original List: 
1 2 3 4 5 
Updated List: 
4 5 1 2 3 

JAVA

输出

Original List: 
1 2 3 4 5 
Updated List: 
4 5 1 2 3 

C#

输出

Original List: 
1 2 3 4 5 
Updated List: 
4 5 1 2 3 

PHP

输出

Original List: 
1 2 3 4 5 
Updated List: 
4 5 1 2 3 
 
下一主题#