您的位置:首页 > 其它

链表翻转,每k个进行翻转

2013-09-19 22:49 232 查看
链表翻转。给出一个链表和一个数k,比如链表1→2→3→4→5→6,k=2,则翻转后2→1→4→3→6→5,若k=3,翻转后3→2→1→6→5→4,若k=4,翻转后4→3→2→1→5→6

#include <iostream>
using namespace std;

struct node{
int data;
node* next;
};

node* init(int n)
{
node* head = new node;
head->data = 1;
head->next = NULL;
node* p, *q;
p = head;
for(int i=2; i<=n; i++)
{
q = new node;
q->data = i;
p->next = q;
p = q;
}
q->next = NULL;
return head;
}

node* reverse(node* h)
{
if(h==NULL || h->next==NULL)
return h;
node* n = h->next;
node* r = reverse(n);
n->next = h;
h->next = NULL;
return r;
}

node* part_reverse(node* h, int n, int k)
{
if(h==NULL || k<=1 || k>n)
return h;
node* h1 = h, *t;
int i=1;
while(h1 && (i++)<k)
h1 = h1->next;
t = h1;
h1 = h1->next;
t->next = NULL;
t = reverse(h);
node* h2 = part_reverse(h1, n-k, k);
h->next = h2;
return t;
}

int main(void)
{
while(1)
{
int n, k;
cin>>n>>k;
node* h = init(n);
node* t;

h = part_reverse(h, n, k);
t = h;
while(t)
{
cout<<t->data<<" ";
t = t->next;
}
cout<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: