1025. 反轉鏈表 (25)
給定一個常數K以及一個單鏈表L,請撰寫程式將L中每K個結點反轉。例如:給定L為1→2→3→4→5→6,K為3,則輸出應該為3→2→1→6→5→4;如果K為4,則輸出應該為4→3→2→1→5→6,即最后不到K個元素不反轉。
輸入格式:
每個輸入包含1個測驗用例。每個測驗用例第1行給出第1個結點的地址、結點總個數正整數N(<= 105)、以及正整數K(<=N),即要求反轉的子鏈結點的個數。結點的地址是5位非負整數,NULL地址用-1表示。
接下來有N行,每行格式為:
Address Data Next
其中Address是結點地址,Data是該結點保存的整數資料,Next是下一結點的地址。
輸出格式:
對每個測驗用例,順序輸出反轉后的鏈表,其上每個結點占一行,格式與輸入相同。
輸入樣例:
00100 6 4
00000 4 99999
00100 1 12309
68237 6 -1
33218 3 00000
99999 5 68237
12309 2 33218
輸出樣例:
00000 4 33218
33218 3 12309
12309 2 00100
00100 1 99999
99999 5 68237
68237 6 -1
下面是我的代碼:
#include<stdio.h>
using namespace std;
struct Node{
int ad;
int data;
int next;
}node[100001],temp[100001];
int main()
{
int fstad,n,k;
while(scanf("%d %d %d",&fstad,&n,&k)!=EOF){ //輸入起始地址,節點數與交換長度
for(int i=0;i<n;i++){
scanf("%d %d %d",&node[i].ad,&node[i].data,&node[i].next); //輸入節點的地址,節點數值與指向下一節點的地址
}
int j=0; //統計有效節點數
for(int i=0;i<n;i++){ //依次找出每個節點并放在temp[]陣列中
if(fstad==node[i].ad){
temp[j++]=node[i];
fstad=node[i].next;
i=-1;
}
if(fstad==-1) break;
}
int cont=0;
int t=0;
for(int i=k-1;i>=0&&cont<j/k;i--){ //對每隔K區間的節點轉置后放入到node[]中
node[t++]=temp[i];
if(i==cont*k){
cont++;
i=cont*k+k;
}
}
if(j%k!=0){ //后面不夠K的部分直接存入對應的node[]中
for(int i=j-j%k;i<n;i++){
node[i]=temp[i];
}
}
for(int i=0;i<j-1;i++){ //將后一節點的node[i].ad放入到前一節點的next中
node[i].next=node[i+1].ad;
}
for(int i=0;i<j;i++){ //依次列印
if(node[i].next==-1) printf("%05d %d %d\n",node[i].ad,node[i].data,node[i].next);
else printf("%05d %d %05d\n",node[i].ad,node[i].data,node[i].next);
}
}
return 0;
}
我測驗了多個例子,都可以通過沒有問題,可是OJ判斷是答案錯誤與超時,求助各位幫忙看看,謝謝。
uj5u.com熱心網友回復:
@自信男孩 能否幫忙看看,謝謝uj5u.com熱心網友回復:
"如果K為4,則輸出應該為4→3→2→1→5→6"這句,若K為4,那么輸出應該是:4→3→2→1→6→5吧
uj5u.com熱心網友回復:
@自信男孩 題目給的是輸出4→3→2→1→5→6,也就是最后不滿足K大小的不進行轉置uj5u.com熱心網友回復:
我也是這個錯誤,樓主找到問題了嗎?
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/88716.html
標籤:新手樂園
上一篇:十進制轉換成八進制
