1. 程式人生 > >PAT (Basic Level) Practice 1025 反轉連結串列

PAT (Basic Level) Practice 1025 反轉連結串列

乙級1025
在這裡插入圖片描述
在這裡插入圖片描述

該題本身就是連結串列基礎演變而來的,連結串列基礎可以看翁愷老師的C語言程式設計基礎,上面講的很詳細了
資料的儲存結構就可以類似連結串列構造:

struct list{
	int address;//儲存當前地址,值,下一個地址的值
	int value;
	int next;
};

(好像更專業的話,取的名字叫node來著?我是小白所以隨便取的)

因為資料量要求是10W以內,所以我是直接開了一個10W的陣列table,陣列下標表示地址,然後內容還是儲存的我定義的結構體(雖然地址存了兩次,但是對於接下來讀取資料來說更好讀)
以head為首,開始根據從address到next將table陣列中的有效資料

(因為輸入的時候可能並不是連結串列中的地址)再放入新陣列li中 無需sort,因為連結串列的特性本身就是對應著串聯的,這樣我們最初輸入的n有可能會去掉無效資料後,值會小於需要反轉的數,所以需要注意K還是可能大於N的
接下來每K個反轉,如果N=6,K=2,那麼就是每2個都要反轉,總共三組分別反轉,我再開了第三個陣列out,每K個倒序放入out陣列中
全部放入之後再將陣列out[i].next值改成out[i+1].address就可以了
AC程式碼:

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
#include<stdlib.h>
using namespace std;
struct list{
	int address;
	int value;
	int next;
};
int main(){
	list *table = new list[100010];
	int add,head,n,change;
	scanf("%d %d %d",&head,&n,&change);
	if(head==-1)	return 0;
	list *li = new list[n];
	for(int i = 0; i<n;i++){//Warning1:輸入的地址可能有不在連結串列中的情況 
		scanf("%d",&add);
		if(add!=-1){//Warning2:輸入的地址是-1需注意 
			table[add].address = add;
			scanf("%d %d",&table[add].value,&table[add].next);
		} else {
			scanf("%d %d",&add,&add);
		}
	}
	li[0] = table[head];
	for(int i = 1;i < n;i++){
		if(table[li[i-1].next].next == -1){
			li[i] = table[li[i-1].next];
			n = i+1;
			break;
		}
		li[i] = table[li[i-1].next];
	}
	change = change%n;
	if(change==0)	change = n;
	
	list *out = new list[n];//正確順序陣列 
	int pos = 0;
	
	int t = 1;
	int changestep = change;
	while(pos<change&&change<=n){//審題沒審到:每 K 個 結點反轉 
		int cha = change - 1;
		for(pos;pos<change;pos++){
		out[pos] = li[cha--];
		}
		if(change/n==0){
			change = changestep * ++t;
		}
	}
	for(pos;pos<n;pos++){
		out[pos] = li[pos];
	}
	for(int i = 0;i<n-1;i++){
		out[i].next = out[i+1].address;
	}
	out[n-1].next = -1; 
	for(int i = 0;i<n;i++){
		if(out[i].next==-1){
			printf("%05d %d %d\n",out[i].address,out[i].value,out[i].next);
		} else {
			printf("%05d %d %05d\n",out[i].address,out[i].value,out[i].next);
		}
	}
	return 0; 
}