📜  C++程序将双向链表旋转N个节点

📅  最后修改于: 2022-05-13 01:54:55.820000             🧑  作者: Mango

C++程序将双向链表旋转N个节点

给定一个双向链表,将链表逆时针旋转 N 个节点。这里 N 是给定的正整数,并且小于链表中的节点数。

N = 2
轮换名单:

例子:

Input : a  b  c  d  e   N = 2
Output : c  d  e  a  b 

Input : a  b  c  d  e  f  g  h   N = 4
Output : e  f  g  h  a  b  c  d 

在亚马逊上问

要旋转双向链表,我们需要将第 N 个节点的下一个节点更改为 NULL,将最后一个节点的下一个节点更改为前一个头节点,将头节点的 prev 更改为最后一个节点,最后将 head 更改为第 (N+1) 个节点和 prev新的头节点为 NULL(双向链表中头节点的上一个为 NULL)
所以我们需要掌握三个节点:第 N 个节点、第 (N+1) 个节点和最后一个节点。从开始遍历列表并在第 N 个节点处停止。存储指向第 N 个节点的指针。我们可以使用 NthNode->next 获得第 (N+1) 个节点。继续遍历直到结束并存储指向最后一个节点的指针。最后,如上所述更改指针,并在 Last Print Rotated List 使用
打印列表函数。

C++
// C++ program to rotate a Doubly linked 
// list counter clock wise by N times
#include 
using namespace std;
  
/* Link list node */
struct Node {
    char data;
    struct Node* prev;
    struct Node* next;
};
  
// This function rotates a doubly linked
// list counter-clockwise and updates the 
// head. The function assumes that N is
// smallerthan size of linked list. It 
// doesn't modify the list if N is greater 
// than or equal to size
void rotate(struct Node** head_ref, int N)
{
    if (N == 0)
        return;
  
    // Let us understand the below code 
    // for example N = 2 and
    // list = a <-> b <-> c <-> d <-> e.
    struct Node* current = *head_ref;
  
    // current will either point to Nth
    // or NULL after this loop. Current 
    // will point to node 'b' in the 
    // above example
    int count = 1;
    while (count < N && current != NULL) {
        current = current->next;
        count++;
    }
  
    // If current is NULL, N is greater
    // than or equal to count of nodes
    // in linked list. Don't change the 
    // list in this case
    if (current == NULL)
        return;
  
    // current points to Nth node. Store 
    // it in a variable. NthNode points to
    // node 'b' in the above example
    struct Node* NthNode = current;
  
    // current will point to last node
    // after this loop current will point 
    // to node 'e' in the above example
    while (current->next != NULL)
        current = current->next;
  
    // Change next of last node to previous
    // head. Next of 'e' is now changed to
    // node 'a'
    current->next = *head_ref;
  
    // Change prev of Head node to current
    // Prev of 'a' is now changed to node 'e'
    (*head_ref)->prev = current;
  
    // Change head to (N+1)th node
    // head is now changed to node 'c'
    *head_ref = NthNode->next;
  
    // Change prev of New Head node to NULL
    // Because Prev of Head Node in Doubly 
    // linked list is NULL
    (*head_ref)->prev = NULL;
  
    // change next of Nth node to NULL
    // next of 'b' is now NULL
    NthNode->next = NULL;
}
  
// Function to insert a node at the
// beginning of the Doubly Linked List
 void push(struct Node** head_ref, int new_data)
{
    struct Node* new_node =  new Node;
    new_node->data = new_data;
    new_node->prev = NULL;
    new_node->next = (*head_ref);
    if ((*head_ref) != NULL)
        (*head_ref)->prev = new_node;
   *head_ref = new_node;
}
  
/* Function to print linked list */
void printList(struct Node* node)
{
    while (node->next != NULL) {
        cout << node->data << " "
             << "<=>"
             << " ";
        node = node->next;
    }
    cout << node->data;
}
  
// Driver's Code
int main(void)
{
    /* Start with the empty list */
    struct Node* head = NULL;
  
    /* Let us create the doubly 
      linked list a<->b<->c<->d<->e */
    push(&head, 'e');
    push(&head, 'd');
    push(&head, 'c');
    push(&head, 'b');
    push(&head, 'a');
  
    int N = 2;
  
    cout << "Given linked list 
";
    printList(head);
    rotate(&head, N);
  
    cout << "
Rotated Linked list 
";
    printList(head);
  
    return 0;
}


输出:
Given linked list 
a  b  c  d  e
Rotated Linked list 
c  d  e  a  b

更多详细信息请参考完整文章旋转 N 个节点的双向链表!