给定一个单链表的头节点 head,实现一个调整单链表的函数,使得每K个节点之间为一组进行逆序,并且从链表的尾部开始组起,头部剩余节点数量不够一组的不需要逆序。(不能使用队列或者栈作为辅助)
#include <stdio.h>
#include <stdlib.h>
struct node{
struct node* next;
int data;
};
typedef struct node node;
/**
* 将begin 到 end之间的节点逆序,不包含end节点
* 返回逆序后的起始节点
* begin: 起始节点 begin_prev: begin前面的一个节点 end结束节点
*/
node* reverse(node *begin, node *begin_prev, node *end) //[begin, end)
{
node *pos = begin;
node *prev = end;
while(pos != end)
{
node *next = pos->next;
pos->next = prev;
prev = pos;
pos = next;
}
if(begin_prev != NULL)
{
begin_prev->next = prev;
}
return prev;
}
node* reverse_k(node *head, int k)
{
if(head == NULL || k <= 1)
{
return head;
}
node* end = NULL;
while(1)
{
node* prev = NULL, *pos = head;
node* prev_k = NULL, *pos_k=head;
int i = 0;
while(pos != end)
{
prev = pos;
pos = pos->next;
++i;
if(i > k)
{
prev_k = pos_k;
pos_k = pos_k->next;
}
}
if(i < k )
{
return head;
}
end = reverse(pos_k, prev_k, pos);
if(pos_k == head)
{
return end;
}
}
}
node* create_list(int a[], int len)
{
node *head = NULL;
int i;
for(i=0; i<len; ++i)
{
node* p = (node *)malloc(sizeof(node));
p->data = a[i];
p->next = head;
head = p;
}
return head;
}
int main()
{
int a[] = {12,13,1,2,14,3,4,6};
int len = sizeof(a) / sizeof(int);
node *head = create_list(a, len);
head = reverse_k(head, 7);
node *pos;
for(pos = head; pos!=NULL; pos=pos->next)
{
printf("%d ", pos->data);
}
return 0;
}