zoukankan      html  css  js  c++  java
  • PAT 甲级 1074 Reversing Linked List (25 分)(链表部分逆置,结合使用双端队列和栈,其实使用vector更简单呐)

                            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

    题意:

    给N个链表结点,以及K,对每K个长度的链表做逆置,输出逆置后的链表。

    题解:

    不是很熟悉vector.reverse()这种工具,用了两个双端队列和一个栈来实现。最后一个测试点没过,原来是有些节点不在链表上,那么需要重新计算节点个数,加个计数器sum,不一定就是n。

    AC代码:

    #include<iostream>
    #include<algorithm>
    #include<deque>
    #include<stack>
    using namespace std;
    struct node{
    	int v;
    	int zhi;
    	int nx;
    }a[100005];
    deque<node>q1,q2;
    stack<node>st;
    int main(){
    	int root,n,k;
    	cin>>root>>n>>k;
    	for(int i=1;i<=n;i++){
    		int x;
    		cin>>x;
    		cin>>a[x].v>>a[x].nx;
    		a[x].zhi=x;//把它自己的编号也要记录下来
    	}
    	int sum=0;//可能有些节点不在链表上,要重新数
    	int p=root;
    	q1.push_back(a[p]);
    	sum++;
    	while(a[p].nx!=-1){
    		int next=a[p].nx;
    		q1.push_back(a[next]);
    		sum++;
    		p=next;
    	}
    	for(int i=1;i<=sum/k;i++){
    		int c=0;
    		while(!q1.empty()){//k个k个分别装入栈里倒一倒再取出来
    			node x=q1.front();
    			q1.pop_front();
    			st.push(x);
    			c++;
    			if(c==k) break;
    		}
    		while(!st.empty()){//倒着再取出来
    			q2.push_back(st.top());
    			st.pop();
    		}
    	}
    	while(!q1.empty()){
    		node x=q1.front();
    		q1.pop_front();
    		q2.push_back(x);
    	}
    	while(!q2.empty()){//输出
    		node x=q2.front();
    		q2.pop_front();
    		if(!q2.empty()) printf("%05d %d %05d
    ",x.zhi,x.v,q2.front().zhi);
    		else printf("%05d %d -1",x.zhi,x.v);	
    	}
    	return 0;
    }
    

    别人的代码:

    #include<bits/stdc++.h>
    using namespace std;
    const int maxn=1e6+10;
    struct node{
        int add,data,Next;
    }a[maxn];
    vector<node>valid,ans;
    int head,n,k;
    int main()
    {
        for(int i=0;i<maxn;i++)a[i].add=i;
        scanf("%d%d%d",&head,&n,&k);
        for(int i=0;i<n;i++)
        {
            int address;
            scanf("%d",&address);
            scanf("%d%d",&a[address].data,&a[address].Next);
        }
        int p=head;
        while(p!=-1)
        {
            valid.push_back(a[p]);
            p=a[p].Next;
        }
        int group=valid.size()/k;
        for(int i=0;i<group;i++)
        {
            reverse(valid.begin()+i*k,valid.begin()+i*k+k);
        }
        for(int i=0;i<valid.size();i++)
        {
            if(i!=valid.size()-1)printf("%05d %d %05d
    ",valid[i].add,valid[i].data,valid[i+1].add);
            else printf("%05d %d -1
    ",valid[i].add,valid[i].data);
        }
        return 0;
    } 
    
  • 相关阅读:
    Docker 学习4 Docker容器虚拟化网络概述
    Ceph 命令
    Day_09【常用API】扩展案例1_程序中使用一个长度为3的对象数组,存储用户的登录名和密码……
    Day_08【面向对象】扩展案例4_年龄为30岁的老王养了一只黑颜色的2岁的宠物……
    Day_08【面向对象】扩展案例3_使用多态的形式创建缉毒狗对象,调用缉毒方法和吼叫方法
    Day_08【面向对象】扩展案例2_测试旧手机新手机类,并给新手机实现玩游戏功能
    Day_08【面向对象】扩展案例1_测试项目经理类和程序员类
    用两个栈实现队列
    二叉树前序、中序、后序遍历相互求法
    洗牌
  • 原文地址:https://www.cnblogs.com/caiyishuai/p/13270597.html
Copyright © 2011-2022 走看看