📜  用于旋转链表的 C++ 程序(1)

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

用于旋转链表的 C++ 程序

旋转链表是指将链表的最后一个节点移动到链表的头部,其实现可以通过三次翻转来实现,而不需要真正地将最后一个节点移动到头部。

以下是一个用于旋转链表的 C++ 程序:

/**
 * 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 == nullptr || k == 0) return head;
        int len = 1;
        ListNode* tail = head, *newHead;
        while(tail->next) { // 求出链表长度和尾节点
            tail = tail->next;
            len++;
        }
        if(k % len == 0) return head; // 如果k是长度的整数倍,那么不用旋转
        tail->next = head; // 首尾相连
        k = len - k % len; // k也可以等价于k%len(这里换了一种求法)
        for(int i = 0; i < k; i++) tail = tail->next; // 找到新的尾节点
        newHead = tail->next; // 新的头节点是尾节点的后一个节点
        tail->next = nullptr; // 断开连接
        return newHead;
    }
};

这里的代码基于链表,定义了一个名为ListNode的结构体,表示链表的每个节点,包括节点的值和后继节点指针。rotateRight函数的输入参数head表示链表的头节点指针,k表示要旋转的次数。函数的输出为旋转后的链表头节点指针。

实现过程可以分为以下几步:

  1. 如果链表为空或者不需要旋转,直接返回链表头指针。
  2. 计算链表长度len和尾节点指针tail
  3. 如果klen的整数倍,则不需要旋转,直接返回原链表头指针。
  4. 首尾相连,将链表变为环形。
  5. 找到新的尾节点,也就是原链表最后一个节点的前k%len个节点。
  6. 新的头节点为新的尾节点的下一个节点。
  7. 断开环形链接,返回新的头节点指针。

这种实现方式虽然具有一定的时间和空间复杂度,但是更为直观易懂,可以为初学者提供更好的理解。