1 //按每k个结点反转链表
2 Node* turn_k(Node* head,int n,int k)
3 {
4 Node* p=head;
5 for(int t=1;t<k;t++) p=p->next; //为了获取最后的返回值,也就是链表指针
6
7 Node* cur=head; //为链表反转而准备的三个辅助指针cur,pre,pnext
8 Node *pre=NULL;
9 Node* pnext=NULL;
10 Node* r=NULL; //r是处理每段尾(首)部的辅助指针
11 Node *q=head; //q是为了获取下一链表段反转后的头地址
12 int m=n/k;
13 for(int i=1;i<=m;i++)
14 {
15 r = cur; //指针r保存当前将要反转段的尾结点
16 for(int j=1;j<=k;j++)
17 {
18 pnext = cur->next;
19 cur->next = pre;
20 pre = cur;
21 cur = pnext;
22 }
23 if(i<m)
24 { q=cur;
25 for(int t=1;t<k;t++) q=q->next;
26 r->next=q; //保证反转后链表段尾连上下一段反转后的头
27 }
28 if(i==m) r->next=cur;
29 }
30 return p;
31 }