1.题目
2.代码
#include<stdio.h>
#include<stdlib.h>
#include<string>
#include<map>
#include<vector>
#include<iostream>
using namespace std;
typedef struct LNode *List;
struct LNode
{
string entryad;
string outad;
int data;
List next;
};
List reverseL(List head,int k)
{
int cnt=1;
List phead,pre,pcur;
phead=head;
pre=phead->next;
pcur=pre->next;
while(cnt<k)
{
if(pcur->next==NULL){
pre->next=NULL;
pre->outad=pcur->outad;
pcur->next=phead->next;
pcur->outad=phead->next->entryad;
phead->next=pcur;
phead->outad=pcur->entryad;
cnt+=1;
}
else{
pre->next=pcur->next;
pre->outad=pcur->next->entryad;
pcur->next=phead->next;
pcur->outad=phead->next->entryad;
phead->next=pcur;
phead->outad=pcur->entryad;
pcur=pre->next;
cnt+=1;
}
}
return pre;
}
void print(List head)
{
List pr;
pr=head;
while(pr->next!=NULL)
{
cout<<pr->next->entryad<<" "<<pr->next->data<<" "<<pr->next->outad<<endl;
pr=pr->next;
}
}
int main()
{
map<string,pair<int,string> >m1;
string ss;
int n,k;
cin>>ss;
scanf("%d%d",&n,&k);
int num=n;
string s,e;
int x,n1=n;
while(n1--)
{
cin>>s>>x>>e;
if(n==1)
{
cout<<s<<" "<<x<<" "<<e<<endl;
return 0;
}
m1[s] = make_pair(x,e);
}
List head,t;
//head=(List)malloc(sizeof(struct LNode));
head= new LNode();
head->next=NULL;
string des=ss;
t=head;
int cn=0;
while(cn<=num)
{
List q = new LNode();
//q=(List)malloc(sizeof(struct LNode));
q->entryad=des;//youwenti
q->data=m1[des].first;
q->outad=m1[des].second;
q->next=NULL;
des=m1[des].second;
t->next=q;
t=q;
cn+=1;
if(des=="-1")
break;
}
// cout<<"cn: "<<cn<<endl;
if(cn==k)
{
List p;
p=reverseL(head,k);
print(head);
}
else
{
int nk;
nk=cn/k;
if(nk==0)
{
List p;
p=reverseL(head,k);
print(head);
}
else if(nk!=0)//正好整除
{
List p;
p=head;
while(nk--)
{
p=reverseL(p,k);
}
print(head);
}
}
return 0;
}
3.分析
- 如何存数据:为了更快的找到地址,采用map存储。因为地址是唯一的,所以采用自己的地址作为key,数值和出地址作为value.使用pair存储。
- 迭代建立链表:初始化初始地址,然后一次用map,像数组下标一样访问地址,存储其(起始地址,值,出地址)。但是由于会存在多余的节点,没有一个节点的出地址是他的起始地址,那么这样的节点就不会被接入到链表。所以创建链表的时候,不可以采用while(n--),应该设置一个计数器,while(cn<=n),cn++这样的操作。已知-1是结束地址,那么当出地址为-1时,则表示当前链表已经到达了结尾,需要跳出循环。否则,map找不到值,会返回0,并不会抛出异常。记得更新n,即节点个数。
- 反转 链表:我们使用原链表进行操作。head为头节点,pre为head后的一个节点,pcur为代反转节点。
pre->next=pcur->next;
pcur->next=phead->next;
phead->next=pcur;
pcur=pre->next;
4.读清题意:every k,每k个反转,而不是前k个。注意边界测试,k=1,N=K,N整除K...