按每k个结点反转链表

 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 }