// 将下标为left到right元素的顺序颠倒 voidreverseElem(sqList &L, int left, int right){ while (left < right) { int temp = L.data[left]; L.data[left] = L.data[right]; L.data[right] = temp; left++; right--; } }
// 三次反转法右移 voidrightMove(sqList &L, int m, int n){ if (m == 0) { // 不需要移动 return; } reverseElem(L, 0, n-1); // 整体反转 reverseElem(L, 0, m-1); reverseElem(L, m, n-1); }
intmain(){ int n, m; cin >> n >> m; sqList L; initList(L, n); // 读取数据进入顺序表 for (int i = 0; i < n; ++i) { cin >> L.data[i]; L.length++; } // 开始三次反转法 m = m % n; rightMove(L, m, n);
// 输出移动后的结果 for (int i = 0; i < L.length; ++i) { if (i != 0) { cout << " "; } cout << L.data[i]; } }
我的思路
用三次反转法实现高效循环右移
核心方法:通过 “整体反转→前 m 个反转→剩余部分反转” 的三次反转,替代低效的直接移动,时间 O (n)、空间 O (1)。