给定一个常数K以及一个单链表L,请编写程序将L中每K个结点反转。例如:给定L为1→2→3→4→5→6,K为3,则输出应该为3→2→1→6→5→4;如果K为4,则输出应该为4→3→2→1→5→6,即最后不到K个元素不反转。
输入格式:
每个输入包含1个测试用例。每个测试用例第1行给出第1个结点的地址、结点总个数正整数N(<= 105)、以及正整数K(<=N),即要求反转的子链结点的个数。结点的地址是5位非负整数,NULL地址用-1表示。
接下来有N行,每行格式为:
Address Data Next
其中Address是结点地址,Data是该结点保存的整数数据,Next是下一结点的地址。
输出格式:
对每个测试用例,顺序输出反转后的链表,其上每个结点占一行,格式与输入相同。
输入样例:00100 6 4
00000 4 99999 00100 1 12309 68237 6 -1 33218 3 00000 99999 5 68237 12309 2 33218输出样例:
00000 4 33218
33218 3 12309 12309 2 00100 00100 1 99999 99999 5 68237 68237 6 -1附上一个递归解法(更新于2017/8/18)
#include#include using namespace std;struct node{ int val; int next;}node[100000];int reverseKGroup(int head,int k){ int cur=head,cnt=0; while(cur!=-1&&cnt!=k) { cur=node[cur].next; ++cnt; } if(cnt==k) { cur=reverseKGroup(cur,k); while(cnt-->0) { int temp=node[head].next; node[head].next=cur; cur=head; head=temp; } head=cur; } return head;}int main(){ int head,n,k; cin>>head>>n>>k; while(n--) { int add,val,next; cin>>add>>val>>next; node[add].val=val; node[add].next=next; } head=reverseKGroup(head,k); while(node[head].next!=-1) { printf("%05d %d %05d\n",head,node[head].val,node[head].next); head=node[head].next; } printf("%05d %d %d\n",head,node[head].val,node[head].next); return 0;}
以前按照链表的操作方法好像是写了一大堆代码orz,而且思维过程真的是很繁琐;
今天再来看这道题,发现这道题其实也是蛮水的。。。 思路: 将数据存入node,然后stack和queue一下就ok了#includestruct node{ int address; int data; int next;}node[100001];struct node *stack[100001];struct node *queue[100001];int top,front,rear;int main(){ int head,n,k; scanf("%d %d %d",&head,&n,&k); while(n--){ int add,d,nextadd; scanf("%d %d %d",&add,&d,&nextadd); node[add].address=add; node[add].data=d; node[add].next=nextadd; } int x=head,cur=head,tag=0; while(x!=-1){ cur=x; for(int i=0;i address,queue[front]->data,queue[front+1]->address); ++front; } printf("%05d %d -1\n",queue[rear-1]->address,queue[rear-1]->data); return 0;}
放上截图: