逆置链表的方法采用头插法。
以数组下标作为链表结点地址的方法,比较绕,而且不好调试;
每次逆转一定长度的链表前先检查剩余的结点数够不够,比较繁琐。
#include<algorithm>
#include<iostream>
using namespace std;
int total, length;
struct node {
int add, val, next;
}table[100010];
bool isEnough(int start, int length) {
int count = 0, cur = start;
while (cur != -1 && count < length) {
count++;
cur = table[cur].next;
}
return count >= length;
}
int main() {
cin >> head >> total >> length;
for (int i = 0; i < total; i++) {
int add;
cin >> add;
cin >> table[add].val >> table[add].next;
}
int reverseHead = 100001, res = 100002, resCur = res;
table[reverseHead].next = -1;
table[res].next = -1;
int cur = head;
while (cur != -1) {
int rear = cur;
if (isEnough(cur, length)) {
for (int i = 0; i < length; i++) {
int temp = table[cur].next;
table[cur].next = table[reverseHead].next;
table[reverseHead].next = cur;
cur = temp;
if (cur == -1) {
break;
}
}
}
else {
table[reverseHead].next = cur;
cur = -1;
}
table[resCur].next = table[reverseHead].next;
resCur = rear;
table[reverseHead].next = -1;
}
cur = table[res].next;
while (table[cur].next != -1) {
printf("%05d %d %05d\n", cur, table[cur].val, table[cur].next);
cur = table[cur].next;
}
printf("%05d %d %d\n", cur, table[cur].val, table[cur].next);
}
二刷:
将地址独立放在结构体中,方便在调试时监控每一个结点的位置;
先计算总共要逆置多少轮,注意给出的结点数 ≠ 链表长度,需要自行计算链表长度。
#include<iostream>
using namespace std;
struct node {
int add, val;
node *next = NULL;
}table[100000];
int main() {
int start, n, size;
cin >> start >> n >> size;
for (int i = 0; i < n; i++) {
int add, val, next;
cin >> add >> val >> next;
table[add].add = add;
table[add].val = val;
if (next != -1) {
table[add].next = &table[next];
}
}
node *dummy = new node(), *cur = dummy;
dummy->next = &table[start];
//get real length of the linked list
int length = 0;
while (cur->next != NULL) {
++length;
cur = cur->next;
}
cur = dummy;
int round = length / size;
node *reverseHead = new node(), *reverseCur = reverseHead;
while (round-- > 0) {
int len = 0;
while (len++ < size) {
node *temp = cur->next;
cur->next = temp->next;
temp->next = reverseCur->next;
reverseCur->next = temp;
}
while (reverseCur->next != NULL) {
reverseCur = reverseCur->next;
}
}
reverseCur->next = cur->next;
cur = reverseHead->next;
while (cur->next != NULL) {
printf("%05d %d %05d\n", cur->add, cur->val, cur->next->add);
cur = cur->next;
}
printf("%05d %d -1\n", cur->add, cur->val);
}