📌  相关文章
📜  计算排序和旋转链表中的旋转次数

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

计算排序和旋转链表中的旋转次数

给定一个先排序的 n 个节点的链表,然后旋转 k 个元素。找出 k 的值。

思想是遍历单向链表来检查条件当前节点的值是否大于下一个节点的值。如果给定的条件为真,则中断循环。否则增加计数器变量并通过 node->next 增加节点。下面是这个方法的实现。

C++
// Program for count number of rotations in
// sorted linked list.
#include 
using namespace std;
/* Linked list node */
struct Node {
    int data;
    struct Node* next;
};
 
// Function that count number of
// rotation in singly linked list.
int countRotation(struct Node* head)
{
    // declare count variable and assign it 1.
    int count = 0;
 
    // declare a min variable and assign to
    // data of head node.
    int min = head->data;
 
    // check that while head not equal to NULL.
    while (head != NULL) {
 
        // if min value is greater then head->data
        // then it breaks the while loop and
        // return the value of count.
        if (min > head->data)
            break;
 
        count++;
 
        // head assign the next value of head.
        head = head->next;
    }
    return count;
}
 
// Function to push element in linked list.
void push(struct Node** head, int data)
{
    // Allocate dynamic memory for newNode.
    struct Node* newNode = new Node;
 
    // Assign the data into newNode.
    newNode->data = data;
 
    // newNode->next assign the address of
    // head node.
    newNode->next = (*head);
 
    // newNode become the headNode.
    (*head) = newNode;
}
 
// Display linked list.
void printList(struct Node* node)
{
    while (node != NULL) {
        printf("%d ", node->data);
        node = node->next;
    }
}
 
// Driver functions
int main()
{
    // Create a node and initialize with NULL
    struct Node* head = NULL;
 
    // push() insert node in linked list.
    // 15 -> 18 -> 5 -> 8 -> 11 -> 12
    push(&head, 12);
    push(&head, 11);
    push(&head, 8);
    push(&head, 5);
    push(&head, 18);
    push(&head, 15);
 
    printList(head);
    cout << endl;
    cout << "Linked list rotated elements: ";
 
    // Function call countRotation()
    cout << countRotation(head) << endl;
 
    return 0;
}


Java
// Program for count number of rotations in
// sorted linked list.
import java.util.*;
 
class GFG
{
   
/* Linked list node */
static class Node {
    int data;
    Node next;
};
 
// Function that count number of
// rotation in singly linked list.
static int countRotation(Node head)
{
   
    // declare count variable and assign it 1.
    int count = 0;
 
    // declare a min variable and assign to
    // data of head node.
    int min = head.data;
 
    // check that while head not equal to null.
    while (head != null) {
 
        // if min value is greater then head.data
        // then it breaks the while loop and
        // return the value of count.
        if (min > head.data)
            break;
 
        count++;
 
        // head assign the next value of head.
        head = head.next;
    }
    return count;
}
 
// Function to push element in linked list.
static Node push(Node head, int data)
{
    // Allocate dynamic memory for newNode.
    Node newNode = new Node();
 
    // Assign the data into newNode.
    newNode.data = data;
 
    // newNode.next assign the address of
    // head node.
    newNode.next = (head);
 
    // newNode become the headNode.
    (head) = newNode;
    return head;
}
 
// Display linked list.
static void printList(Node node)
{
    while (node != null) {
        System.out.printf("%d ", node.data);
        node = node.next;
    }
}
 
// Driver functions
public static void main(String[] args)
{
   
    // Create a node and initialize with null
    Node head = null;
 
    // push() insert node in linked list.
    // 15.18.5.8.11.12
    head = push(head, 12);
    head = push(head, 11);
    head = push(head, 8);
    head = push(head, 5);
    head = push(head, 18);
    head = push(head, 15);
 
    printList(head);
    System.out.println();
    System.out.print("Linked list rotated elements: ");
 
    // Function call countRotation()
    System.out.print(countRotation(head) +"\n");
 
}
}
 
// This code contributed by gauravrajput1


Python3
# Program for count number of rotations in
# sorted linked list.
 
# Linked list node
class Node:
     
    def __init__(self, data):
         
        self.data = data
        self.next = None
 
# Function that count number of
# rotation in singly linked list.
def countRotation(head):
 
    # Declare count variable and assign it 1.
    count = 0
  
    # Declare a min variable and assign to
    # data of head node.
    min = head.data
  
    # Check that while head not equal to None.
    while (head != None):
  
        # If min value is greater then head->data
        # then it breaks the while loop and
        # return the value of count.
        if (min > head.data):
            break
  
        count += 1
  
        # head assign the next value of head.
        head = head.next
     
    return count
 
# Function to push element in linked list.
def push(head, data):
 
    # Allocate dynamic memory for newNode.
    newNode = Node(data)
  
    # Assign the data into newNode.
    newNode.data = data
  
    # newNode->next assign the address of
    # head node.
    newNode.next = (head)
  
    # newNode become the headNode.
    (head) = newNode
    return head
 
# Display linked list.
def printList(node):
 
    while (node != None):
        print(node.data, end = ' ')
        node = node.next
     
# Driver code
if __name__=='__main__':
     
    # Create a node and initialize with None
    head = None
  
    # push() insert node in linked list.
    # 15 -> 18 -> 5 -> 8 -> 11 -> 12
    head = push(head, 12)
    head = push(head, 11)
    head = push(head, 8)
    head = push(head, 5)
    head = push(head, 18)
    head = push(head, 15)
  
    printList(head);
    print()
    print("Linked list rotated elements: ",
          end = '')
  
    # Function call countRotation()
    print(countRotation(head))
 
# This code is contributed by rutvik_56


Javascript



输出

15 18 5 8 11 12 
Linked list rotated elements: 2

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