Given a constant KK and a singly linked list LL, you are supposed to reverse the links of every KK elements on LL. For example, given LL being 1→2→3→4→5→6, if K = 3K=3, then you must output 3→2→1→6→5→4; if K = 4K=4, you must output 4→3→2→1→5→6.
Each input file contains one test case. For each case, the first line contains the address of the first node, a positive NN (\le 10^5≤105) which is the total number of nodes, and a positive KK (\le N≤N) which is the length of the sublist to be reversed. The address of a node is a 5-digit nonnegative integer, and NULL is represented by -1.
Then NN lines follow, each describes a node in the format:
Address Data Nextwhere Address is the position of the node, Data is an integer, and Nextis the position of the next node.
For each case, output the resulting ordered linked list. Each node occupies a line, and is printed in the same format as in the input.
68237 6 -1
#include "iostream" #include "stdio.h" using namespace std; struct Node { int data; int next; }; Node pointer[100001]; int step = 0; int rel; int first, last; // 按规定反转链表 int reverse(int k, int start) { step++; int cnt = 1; int now, old, temp; now = start; //指向反转后链表的头节点 old = pointer[now].next; //指向还未反转的链表的头结点 while (cnt < k) { temp = pointer[old].next; // 指向还未反转的链表的头结点的下一个节点 pointer[old].next = now; now = old; old = temp; temp = pointer[temp].next; cnt++; } if (step == 1) { /* 第一次反转 */ rel = now; /* 记下反转链表新的头节点 */ } pointer[start].next = old; /* 将其先指向第n*k+1个数 再在下一次逆序的时候 修改这个值*/ if (step != 1) { pointer[last].next = now; /* 修改值~~ */ } last = start; /*更新此刻已完成逆序的链表的最后一个元素last*/ return old; } int main() { int addr, data, nex; int start, n, k; int len = 0; cin >> start >> n >> k; while (n--) { //建立链表 cin >> addr >> data >> nex; pointer[addr].data = data; pointer[addr].next = nex; } int cnt = start; while (cnt != -1) { /* 因为老师说会有不在链表中的多余节点 计算链表中的真正节点 */ len++; cnt = pointer[cnt].next; } int s; s = len / k; rel = start; int now = start; for (int i = 0; i < s; i++) { //反转链表 now = reverse(k, now); } while (rel != -1) { if (pointer[rel].next != -1) printf("d %d d\n", rel, pointer[rel].data, pointer[rel].next); else printf("d %d %d\n", rel, pointer[rel].data, pointer[rel].next); rel = pointer[rel].next; } }