C++程序 计算已排序旋转链表中的旋转数

C++程序 计算已排序旋转链表中的旋转数

给定一个有n个节点的链表,首先是已排序的,然后旋转了k个元素。找到k的值。

C++程序 计算已排序旋转链表中的旋转数

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

// 计算已排序链表中旋转数量的程序。
#include
using namespace std;
/* 链表节点 */
struct Node {
    int data;
    struct Node* next;
};

// 在单链表中计数旋转数的函数。
int countRotation(struct Node* head)
{
    // 声明计数变量并将其分配为1。
    int count = 0;

    // 声明min变量并将其分配为
    // 头结点的数据。
    int min = head->data;

    // 检查头是否不等于NULL。
    while (head != NULL) {

        // 如果min值大于head->data,那么它将中断循环,
        // 并返回计数的值。
        if (min > head->data)
            break;

        count++;

        // 头分配头的下一个值。
        head = head->next;
    }
    return count;
}

// 在链接列表中推入元素的函数。
void push(struct Node** head, int data)
{
    // 为新节点分配动态内存。
    struct Node* newNode = new Node;

    // 将数据分配给newNode。
    newNode->data = data;

    // newNode->next分配头节点的地址。
    newNode->next = (*head);

    // newNode变成headNode。
    (*head) = newNode;
}

// 显示链接列表。
void printList(struct Node* node)
{
    while (node != NULL) {
        printf("%d ", node->data);
        node = node->next;
    }
}

// 驱动程序函数
int main()
{
    // 创建一个节点并初始化为NULL
    struct Node* head = NULL;

    // push()在链表中插入节点。
    // 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: ";

    // 调用函数countRotation()
    cout << countRotation(head) << endl;

    return 0;
}  

输出

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

时间复杂度: O(N),其中N表示链表的长度。

辅助空间: O(1),不需要额外的空间,因此是一个常数。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

C++ 示例