1074 Reversing Linked List (25分)

在这里插入图片描述
逆置链表的方法采用头插法。

以数组下标作为链表结点地址的方法,比较绕,而且不好调试;
每次逆转一定长度的链表前先检查剩余的结点数够不够,比较繁琐。

#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);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值