📜  C++ 程序在排序和旋转的链表中计算旋转(1)

📅  最后修改于: 2023-12-03 14:39:55.832000             🧑  作者: Mango

C++程序在排序和旋转的链表中计算旋转

当需要对排序和旋转的链表进行计算旋转的操作时,C++语言是一个非常好的选择。下面是一个简单的C++程序来实现这个操作。

题目描述

给定一个排序的链表,将链表旋转k次,其中k是非负整数。

分析

对于这个问题,我们可以使用以下步骤来解决:

  1. 先遍历一遍链表,获取链表的长度n。

  2. 对k取模运算,得到实际需要旋转的次数。

  3. 将链表从倒数第k个节点处断开,并将第k个节点作为新的头节点。

  4. 将原链表的尾节点指向原来的头节点,形成一个环。

  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 || head->next == NULL || k == 0) return head;
        
        int n = 1;
        ListNode* p = head;
        while (p->next != NULL) {
            p = p->next;
            n++;
        }
        
        k = k % n;
        if (k == 0) return head;
        
        ListNode* q = head;
        for (int i = 0; i < n - k - 1; i++) {
            q = q->next;
        }
        
        p->next = head;
        head = q->next;
        q->next = NULL;
        
        return head;
    }
};
解释

这个程序使用了一个指向ListNode的指针head来表示链表的头节点,以及一个整数k来表示需要旋转的次数。

首先,程序遍历链表一遍,得到链表的长度n。然后,通过对k取模,计算出实际需要旋转的次数。

接下来,程序使用一个指针q来表示新的尾节点。通过遍历链表,找到倒数第k个节点,并将其作为新的头节点,同时将原链表的尾节点连接到原来的头节点上,形成一个环。

最后,将指针q指向NULL,表示新的尾节点的下一个节点为空,这样新的链表就构建完成了。

总结

以上就是C++程序在排序和旋转的链表中计算旋转的方法。这个程序简单易懂,思路清晰,可以帮助我们更好地理解链表的相关知识。