02-线性结构3 Reversing Linked List

 第一次提交

02-线性结构3 Reversing Linked List_第1张图片

第二次

02-线性结构3 Reversing Linked List_第2张图片

今日积累:while(n--){} n结束的值是-1而不是0 (꒪⌓꒪)

code

# include 

struct Node {
	int data;
	int p_nxt;
} L[100000];

int main(void)
{
	int p_start; // first node address
	int K; 
	int N; //不保真,待会要顺着链表再查一次

	// 输入数据
	std::cin >> p_start >> N >> K;
	while (N--)
	{
		int a, b, c;
		std::cin >> a >> b >> c;
		L[a] = Node{ b, c };
	}

	// 检查数据
	N = 0;
	for (int p = p_start; p != -1; p = L[p].p_nxt) ++N;

	// 反转
	int nxt_p = L[p_start].p_nxt, nxt_pp = L[nxt_p].p_nxt; // 修改指针之前的备份

	int * lasthead[10000];
	int front = 0, rare = 0;
	lasthead[++rare] = &p_start;

	for (int i = 0, p = p_start; p != -1;  ++i)
	{
		if ((i + 1) % K == 0 || i % K == 0 && i+K>N)
		{
			*lasthead[++front] = p;
			if (i % K == 0 && i + K > N) break;
		}
		else
		{
			L[nxt_p].p_nxt = p; // 反转
		}
		if (i % K == 0) lasthead[++rare] = &L[p].p_nxt;
		p = nxt_p;
		nxt_p = nxt_pp;
		nxt_pp = L[nxt_pp].p_nxt;
	}
	if (front != rare) *lasthead[++front] = -1;

	// 输出
	for (int p = p_start; p != -1; p = L[p].p_nxt)
	{
		if (L[p].p_nxt != -1) printf("%05d %d %05d\n", p, L[p].data, L[p].p_nxt);
		else printf("%05d %d -1\n", p, L[p].data);
	}
	return 0;
}

你可能感兴趣的:(ZJU数据结构,算法,数据结构,图论)