PAT-1133(Splitting A Linked List)vector的应用+链表+思维

Splitting A Linked List

PAT-1133

  • 本题一开始我是完全按照构建链表的数据结构来模拟的,后来发现可以完全使用两个vector来解决
  • 一个重要的性质就是位置是相对不变的。
#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
#include<cstdio>
#include<sstream>
#include<set>
#include<map>
using namespace std;
const int maxn=100005;
struct Node{
	int address,data,next;
	int trnext;//下一节点 
//	int trpre;//父节点 
	Node(){}
	Node(int a,int b,int c):address(a),data(b),next(c){}
};
Node node[maxn];
map<int,int>ma;
int main(){
	int start,n,k;
	cin>>start>>n>>k;
	for(int i=0;i<n;i++){
		int address,data,next;
		cin>>address>>data>>next;
		ma[address]=i;
		node[i]=Node(address,data,next);
		if(address==start){
			start=i;
		} 
	}
	for(int i=0;i<n;i++){
		int next=node[i].next;
		int trnext;
		if(next==-1)
			trnext=-1;
		else trnext=ma[next];
		node[i].trnext=trnext;
	}
	int neg=-1;//指向当前待插入的负数节点 
	int now=start;//当前节点 
	int pre=-1;//前驱结点 
	for(int next=start;next!=-1;){
		int data=node[next].data;
		now=next;
		next=node[next].trnext;
		if(data<0){
			if(neg==-1&&pre==-1){//第一个出现的负节点 和头结点 
				pre=now;
				neg=now;
			}else if(neg==-1){
				node[pre].trnext=next;
				node[now].trnext=start;
				start=now;
				neg=start;//第一个 非head的负节点
				//pre不变 
			}else{
				node[pre].trnext=next;
				node[now].trnext=node[neg].trnext;
				node[neg].trnext=now;
				neg=now;
			}
		}else{
			pre=now;
		}
	}
	//所有在0-k之间的数必须出现在大于k的数之前
	pre=neg;
	int next;
	if(neg==-1){
		next=start;
	}else next=node[neg].trnext;
	for(;next!=-1;){
		int data=node[next].data;
		now=next;
		next=node[next].trnext;
		if(data<=k&&data>=0){
			if(neg==-1&&pre==-1){//第一个出现的负节点 和头结点 
				pre=now;
				neg=now;
			}else if(neg==-1){//表示没有负数节点 
				node[pre].trnext=next;
				node[now].trnext=start;
				start=now;
				neg=now;//第一个 非head的负节点
				//pre不变 
			}else{
				node[pre].trnext=next;
				node[now].trnext=node[neg].trnext;
				node[neg].trnext=now;
				neg=now;
			}
		}else{
			pre=now;
		}
	}
	for(now=start;now!=-1;now=node[now].trnext){
		int a=node[now].address;
		int b=node[now].data;
		int c=node[now].trnext;
		if(c!=-1){
			c=node[c].address;
		}
		if(c!=-1){
			printf("%05d %d %05d\n",a,b,c);
		}else{
			printf("%05d %d %d\n",a,b,c);
		}
//		cout<<node[now].address<<" "<<node[now].data<<" "<<node[node[now].trnext].address<<endl;
	}
	return 0;
}
#include<iostream>
#include<vector>
using namespace std;
struct node{
    int id,data,next;
};
int main(){
    int begin, n, k, s, d, e;
    cin>>begin>>n>>k;
    node a[100010];
    vector<node> v,ans;
    for(int i=0;i<n;i++){
        scanf("%d%d%d\n",&s,&d,&e);
        a[s]={s,d,e};
        
    }
    for(;begin!=-1;begin=a[begin].next){
        v.push_back(a[begin]);
    }
    for(int i=0;i<v.size();i++){
        if(v[i].data<0)ans.push_back(v[i]);
    }
    for(int i=0;i<v.size();i++){
        if(v[i].data>=0 && v[i].data<=k)ans.push_back(v[i]);
    }
    for(int i=0;i<v.size();i++){
        if(v[i].data>k)ans.push_back(v[i]);
    }
    for(int i=0;i<ans.size();i++){
        if(i!=ans.size()-1)printf("%05d %d %05d\n",ans[i].id,ans[i].data,ans[i+1].id);
        else printf("%05d %d -1",ans[i].id,ans[i].data);
    }
    return 0;
}
posted @ 2020-09-20 18:00  Garrett_Wale  阅读(144)  评论(0编辑  收藏  举报