zoukankan      html  css  js  c++  java
  • pat 1074 Reversing Linked List (25分) 链表反转

    Given a constant K and a singly linked list L, you are supposed to reverse the links of every K elements on L. For example, given L being 1→2→3→4→5→6, if K=3, then you must output 3→2→1→6→5→4; if K=4, you must output 4→3→2→1→5→6.

    Input Specification:

    Each input file contains one test case. For each case, the first line contains the address of the first node, a positive N (≤) which is the total number of nodes, and a positive K (≤) which is the length of the sublist to be reversed. The address of a node is a 5-digit nonnegative integer, and NULL is represented by -1.

    Then N lines follow, each describes a node in the format:

    Address Data Next
    
     

    where Address is the position of the node, Data is an integer, and Next is the position of the next node.

    Output Specification:

    For each case, output the resulting ordered linked list. Each node occupies a line, and is printed in the same format as in the input.

    Sample Input:

    00100 6 4
    00000 4 99999
    00100 1 12309
    68237 6 -1
    33218 3 00000
    99999 5 68237
    12309 2 33218

    Sample Output:

    00000 4 33218
    33218 3 12309
    12309 2 00100
    00100 1 99999
    99999 5 68237
    68237 6 -1

    解题思路:

    这道题目,用一个vector,按照顺序把 节点依次存起来,输入是4 - > 1 - > 6 -> 3 ->5 -> 2  按照 1->2->3->4->5->6存放,再反转vector

    #include<cstdio>
    #include<cstdlib>
    #include<cmath>
    #include<vector>
    #include<algorithm>
    
    using namespace std;
    
    typedef struct Node{
    	int data;
    	int order;
    	int next;
    }Node;
    Node nodes[100010];
    int main(){
    //	freopen("C:\Users\zzloyxt\Desktop\1.txt","r",stdin);
    	
    	int first,n,k;
    	scanf("%d %d %d",&first,&n,&k);
    	
    	for(int i=0;i<n;i++){
    		int data,order,next;
    		scanf("%d %d %d",&data,&order,&next);
    		nodes[data].data = data;
    		nodes[data].order = order;
    		nodes[data].next = next;		
    	}
    	vector<Node> V;
    	
    	for(int i=first;i!=-1;i = nodes[i].next){
    		V.push_back(nodes[i]);
    	}
    	
    	for(int i=0;i<=V.size()-k;i=i+k){
    		reverse(V.begin()+i,V.begin()+i+k);
    	}
    	
    	for(int i=0;i<V.size()-1;i++){
    		printf("%05d %d %05d
    ",V[i].data,V[i].order,V[i+1].data);
    	}
    	
    	printf("%05d %d %d
    ",V[V.size()-1].data, V[V.size()-1].order,-1);
    	
    	return 0;
    }
    

    注意这里的reverse()函数,传的是iterator,reverse(V.begin(), V.begin() + k),最后一个单独输出

  • 相关阅读:
    (转)Android之内存泄漏调试学习与总结
    (转)linux下bluetooth编程(七)SDP协议
    (转)Linux下Bluez的编程实现
    (转)linux下bluetooth编程(八)SDP层编程
    (转)linux下bluetooth编程(二)blueZ协议栈
    (转)linux下bluetooth编程(六)L2CAP层编程实例
    (转)linux下bluetooth编程(五)bluetooth与socket
    (转)linux下bluetooth编程(四)L2CAP层编程
    (转)linux下bluetooth编程(一)基础概念
    (转)linux下bluetooth编程(三)HCI层编程
  • 原文地址:https://www.cnblogs.com/zzlback/p/12419612.html
Copyright © 2011-2022 走看看