1. 程式人生 > 實用技巧 >PAT A1074 Reversing Linked List (25分)

PAT A1074 Reversing Linked List (25分)



題意:

給N個連結串列結點,以及K,對每K個長度的連結串列做逆置,輸出逆置後的連結串列。

題解:

不是很熟悉vector.reverse(),所以每次翻轉單獨處理,但是要注意最後一個結點指的地址可能會在下輪翻轉中變化,所以需要進行記錄。
注意%05d的輸出格式會使得-1的輸出出現問題,因此要分開考慮
還有一種思路是利用map做地址與儲存的對映,由於10^5的int map基本上不會超時

#include <cstdio>
using namespace std;
const int N = 100010;
struct Node{
    int v;
    int next;
}node[N];

int main(){
    int start,n,k;
    scanf("%d %d %d",&start,&n,&k);
    int add;
    for(int i = 0;i<n;i++){
        scanf("%d" ,&add);
        scanf("%d %d",&node[add].v,&node[add].next);
    }
    int temp = start;
    int address[k];//存放即將反轉的連結串列的地址
    bool flag = true;
    int time = 0;
    int lastend;
    while(temp!=-1){
        if(time!=0) lastend = address[0];
        for(int i = 0;i<k;i++){
            address[i] = temp;
            if(temp == -1){
                flag = false;
                break;
            }
            temp = node[temp].next;            
        }
        if(flag==true){//未到底開始反轉
            for(int i = 0;i  < k ; i++){
                if(i==0){ 
                    node[address[0]].next = temp;                  
                }else{
                    node[address[i]].next  = address[i-1];
                }
            }
            time++;
        }else{
            break;
        }
        
        //更新start
        if(time==1){//第一次反轉
            start = address[k-1];
        }else{
            node[lastend].next = address[k - 1];
        }
    }
    while(start!=-1){
        if(node[start].next!=-1) printf("%05d %d %05d\n",start,node[start].v,node[start].next);
        else printf("%05d %d %d\n",start,node[start].v,node[start].next);
        start = node[start].next;
    }
    
}