# 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

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\n",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{
}a[maxn];
vector<node>valid,ans;
int main()
{
for(int i=0;i<n;i++)
{
}
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++)
{
}
return 0;
}


©️2019 CSDN 皮肤主题: 像素格子 设计师: CSDN官方博客