题目详情 题目分析:
陈越老师说有些同学投机取巧,所以一些结点被放在了链表外面,防止同学们有排序作弊但我还是想办法绕过了老师的坑,我知道这门课学的是数据结构,这题本意想让我们练习一下链表,我这样不用链表的方法让大家见笑了注意并不是所有的节点都在链表里因为是数据结构,所以本题避免用STL来完成题目 #include <iomanip> #include <iostream> using namespace std; int start, tmp1, tmp2, tmpNum, num, k, a[111111], p[111111], b[111111], pr[111111], result[111111], number, kk, j; int main() { ios::sync_with_stdio(false);//cin,cout加速,否则100000规模的数据超时 cin >> start >> num >> k;//start是首结点的地址 for (int i = 0; i < num; i++) { cin >> tmp1 >> tmpNum >> tmp2;//开始输入 pr[tmp1] = tmpNum;//这个数组的功能就是以本身的地址为数组下标,找到这个结点的值 p[tmpNum] = tmp1;//这个数组的功能就是以结点的值为数组下标,找到这个结点的地址 b[tmpNum] = tmp2;//这个数组的功能就是以结点的值为数组下标,找到这个结点的后一个结点的地址 } while (start != -1)//如果这个结点的下一个地址为-1说明这是最后一个结点 { a[number++] = pr[start];//通过结点本身的地址为数组下标,找到这个结点的值并放到a数组里,a数组用来放按顺序放整个链表的数据的 start = b[pr[start]];//通过结点的值为数组下标,找到这个结点的后一个结点的地址,准备下一次循环,把数据串起来放在a数组里 } for (int i = 0; i < number; i++) result[i] = a[i];//先把a复制到result里,准备反转 while (kk + k <= number)//如果现在准备开始反转的位置加上跨度,大于整个链表的长度就停止 { for (int i = kk + k - 1; i >= kk; i--) result[2 * kk + k - 1 - i] = a[i];//反转操作 kk = k + kk;//移动到下一个开始反转的地方 } while (j != number) { cout << setw(5) << setfill('0') << p[result[j]] << " " << result[j] << " ";//输出整数,一共五位,不足位补零 j == number - 1 ? cout << -1 : cout << setw(5) << setfill('0') << p[result[j + 1]] << endl;//最后一个结点要特判 j++; } }Reference: 四种反转数组的方法与时间比较