📜  链表顺时针旋转的C++程序(1)

📅  最后修改于: 2023-12-03 15:12:32.547000             🧑  作者: Mango

链表顺时针旋转的 C++ 程序

本文介绍一种 C++ 实现链表顺时针旋转的方法。本方法根据用户输入的参数 k,将链表中的元素依次向右移动 k 个位置。本方法时空复杂度均为 O(n),适用于链表元素个数较少的情况。

实现思路

本程序的实现思路如下:

  1. 统计链表中元素个数 $n$。
  2. 计算实际需要右移的距离 $k'$。
  3. 将链表的尾节点连接到头节点,形成环形链表。
  4. 从头节点开始移动 $n - k'$ 个位置,找到新的头节点。
  5. 断开环形链表,返回新的头节点。
代码实现

根据以上思路,我们可以实现以下代码:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* rotateRight(ListNode* head, int k) {
        if (head == NULL) return head;
        ListNode* tail = head;
        int n = 1;  // 计算链表元素个数及尾节点位置
        while (tail->next != NULL) {
            tail = tail->next;
            n++;
        }
        k = k % n;  // 计算实际需要右移的距离
        if (k == 0) return head;  // 特判 k == 0 的情况
        tail->next = head;  // 将尾节点连接到头节点
        ListNode* new_head = head;
        // 找到新的头节点
        for (int i = 0; i < n - k - 1; i++) {
            new_head = new_head->next;
        }
        ListNode* next_head = new_head->next;
        new_head->next = NULL;  // 断开环形链表
        return next_head;
    }
};

本程序的时间复杂度为 O(n),其中 n 为链表元素个数;空间复杂度为 O(1)。

总结

本程序实现了 C++ 链表顺时针旋转的功能,适用于链表元素个数较少的情况。该程序的时间复杂度为 O(n),空间复杂度为 O(1)。