📜  通过 N 个节点旋转双向链表

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

通过 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 

亚马逊询问

1、要旋转双向链表,首先我们需要遍历链表,找到最后一个节点的地址。

2. 然后把它做成一个循环链表。

3. 然后将头部和临时节点移动 n 个节点。

4. 然后将链表设为非循环。

C++
#include
using namespace std;
 
class Node
{
    public:
        char data;
        Node* next;
        Node* pre;
    Node(int data)
    {
        this->data=data;
        pre=NULL;
        next=NULL;
    }
};
 
void insertAtHead(Node* &head, int data)
{
    Node* n = new Node(data);
    if(head==NULL)
    {
        head=n;
        return;
    }
    n->next=head;
    head->pre=n;
    head=n;
    return;
}
void insertAtTail(Node* &head, int data)
{
    if(head==NULL)
    {
        insertAtHead(head,data);
        return;
    }
    Node* temp=head;
    while(temp->next!=NULL)
    {
        temp=temp->next;
    }
    Node* n=new Node(data);
    temp->next=n;
    n->pre=temp;
    return;
}
void display(Node* head)
{
    while(head!=NULL)
    {
        cout << head->data << "-->";
        head=head->next;
    }
    cout << "NULL\n";
}
 
void rotateByN(Node* &head, int pos)
{
    // return without any changes if positin is 0.
    if(pos==0) return;
 
    // Finding last node.
    Node* temp=head;
    while(temp->next!=NULL)
    {
        temp=temp->next;
    }
    // making the list circular.
    temp->next=head;
    head->pre=temp;
 
    // move head and temp by the given position.
    int count=1;
    while(count<=pos)
    {
        head=head->next;
        temp=temp->next;
        count++;
    }
 
    // now again make list un-circular.
    temp->next=NULL;
    head->pre=NULL;
}
int main()
{
    Node* head=NULL;
    insertAtTail(head,'a');
    insertAtTail(head,'b');
    insertAtTail(head,'c');
    insertAtTail(head,'d');
    insertAtTail(head,'e');
 
    int n=2;
    cout << "\nBefore Rotation : \n";
    display(head);
    rotateByN(head,n);
    cout << "\nAfter Rotation : \n";
    display(head);
    cout << "\n\n";
 
    return 0;
}


Java
// Java program to rotate a Doubly linked
// list counter clock wise by N times
class GfG {
 
/* Link list node */
static class Node
{
    char data;
    Node prev;
    Node next;
}
static Node head = null;
 
// 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
static void rotate( int N)
{
    if (N == 0)
        return;
 
    // Let us understand the below code
    // for example N = 2 and
    // list = a <-> b <-> c <-> d <-> e.
    Node current = head;
 
    // 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
    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;
 
    // Change prev of Head node to current
    // Prev of 'a' is now changed to node 'e'
    (head).prev = current;
 
    // Change head to (N+1)th node
    // head is now changed to node 'c'
    head = NthNode.next;
 
    // Change prev of New Head node to NULL
    // Because Prev of Head Node in Doubly
    // linked list is NULL
    (head).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
static void push(char new_data)
{
    Node new_node = new Node();
    new_node.data = new_data;
    new_node.prev = null;
    new_node.next = (head);
    if ((head) != null)
        (head).prev = new_node;
head = new_node;
}
 
/* Function to print linked list */
static void printList(Node node)
{
    while (node != null && node.next != null)
    {
        System.out.print(node.data + " ");
        node = node.next;
    }
    if(node != null)
    System.out.print(node.data);
}
 
// Driver's Code
public static void main(String[] args)
{
    /* Start with the empty list */
    // Node head = null;
 
    /* Let us create the doubly
    linked list a<->b<->c<->d<->e */
    push( 'e');
    push( 'd');
    push('c');
    push('b');
    push( 'a');
 
    int N = 2;
 
    System.out.println("Given linked list ");
    printList(head);
    rotate( N);
    System.out.println();
    System.out.println("Rotated Linked list ");
    printList(head);
}
}
 
// This code is contributed by Prerna Saini


Python3
# Node of a doubly linked list
class Node:
    def __init__(self, next = None,
                       prev = None, data = None):
        self.next = next # reference to next node in DLL
        self.prev = prev # reference to previous node in DLL
        self.data = data
 
def push(head, new_data):
 
    new_node = Node(data = new_data)
 
    new_node.next = head
    new_node.prev = None
 
    if head is not None:
        head.prev = new_node
 
    head = new_node
    return head
 
def printList(head):
 
    node = head
 
    print("Given linked list")
    while(node is not None):
        print(node.data, end = " "),
        last = node
        node = node.next
     
def rotate(start, N):
    if N == 0 :
        return
 
    # Let us understand the below code
    # for example N = 2 and
    # list = a <-> b <-> c <-> d <-> e.
    current = start
 
    # current will either point to Nth
    # or None after this loop. Current
    # will point to node 'b' in the
    # above example
    count = 1
    while count < N and current != None :
        current = current.next
        count += 1
 
    # If current is None, N is greater
    # than or equal to count of nodes
    # in linked list. Don't change the
    # list in this case
    if current == None :
        return
 
    # current points to Nth node. Store
    # it in a variable. NthNode points to
    # node 'b' in the above example
    NthNode = current
 
    # current will point to last node
    # after this loop current will point
    # to node 'e' in the above example
    while current.next != None :
        current = current.next
 
    # Change next of last node to previous
    # head. Next of 'e' is now changed to
    # node 'a'
    current.next = start
 
    # Change prev of Head node to current
    # Prev of 'a' is now changed to node 'e'
    start.prev = current
 
    # Change head to (N+1)th node
    # head is now changed to node 'c'
    start = NthNode.next
 
    # Change prev of New Head node to None
    # Because Prev of Head Node in Doubly
    # linked list is None
    start.prev = None
 
    # change next of Nth node to None
    # next of 'b' is now None
    NthNode.next = None
 
    return start
 
# Driver Code
if __name__ == "__main__":
    head = None
 
    head = push(head, 'e')
    head = push(head, 'd')
    head = push(head, 'c')
    head = push(head, 'b')
    head = push(head, 'a')
 
    printList(head)
    print("\n")
     
    N = 2
    head = rotate(head, N)
 
    printList(head)
 
# This code is contributed by vinayak sharma


C#
// C# program to rotate a Doubly linked
// list counter clock wise by N times
using System;
 
class GfG
{
 
/* Link list node */
public class Node
{
    public char data;
    public Node prev;
    public Node next;
}
static Node head = null;
 
// 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
static void rotate( int N)
{
    if (N == 0)
        return;
 
    // Let us understand the below code
    // for example N = 2 and
    // list = a <-> b <-> c <-> d <-> e.
    Node current = head;
 
    // 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
    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;
 
    // Change prev of Head node to current
    // Prev of 'a' is now changed to node 'e'
    (head).prev = current;
 
    // Change head to (N+1)th node
    // head is now changed to node 'c'
    head = NthNode.next;
 
    // Change prev of New Head node to NULL
    // Because Prev of Head Node in Doubly
    // linked list is NULL
    (head).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
static void push(char new_data)
{
    Node new_node = new Node();
    new_node.data = new_data;
    new_node.prev = null;
    new_node.next = (head);
    if ((head) != null)
        (head).prev = new_node;
    head = new_node;
}
 
/* Function to print linked list */
static void printList(Node node)
{
    while (node != null && node.next != null)
    {
        Console.Write(node.data + " ");
        node = node.next;
    }
    if(node != null)
    Console.Write(node.data);
}
 
// Driver Code
public static void Main(String []args)
{
    /* Start with the empty list */
    // Node head = null;
 
    /* Let us create the doubly
    linked list a<->b<->c<->d<->e */
    push( 'e');
    push( 'd');
    push( 'c');
    push( 'b');
    push( 'a');
 
    int N = 2;
 
    Console.WriteLine("Given linked list ");
    printList(head);
    rotate( N);
    Console.WriteLine();
    Console.WriteLine("Rotated Linked list ");
    printList(head);
}
}
 
// This code is contributed by Arnab Kundu


Javascript


Output:
Before Rotation : 
a-->b-->c-->d-->e-->NULL
After Rotation :
c-->d-->e-->a-->b-->NULL

时间复杂度:O(N)

空间复杂度:O(1)

如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程学生竞争性编程现场课程