给定一个单链表的头指针head,同时给定K值,返回逆序后的链表的头指针。
#include<iostream>
#include <vector>
using namespace std;
struct ListNode
{
int val;
struct ListNode *next;
ListNode(int x): val(x),next(NULL) {}
};
class CreatList
{
public:
ListNode *Creat(vector<int> A)
{
if(A.empty())
return NULL;
ListNode *head=new ListNode(A[0]),*p=head;
for(vector<int>::iterator iter=A.begin()+1;iter!=A.end();iter++)
{
(*p).next=new ListNode(*iter);
p=(*p).next;
}
return head;
}
};
void print(ListNode *head)
{
ListNode *p=head;
while(p)
{
cout<<(*p).val<<" ";
p=(*p).next;
}
cout<<endl;
}
void part_sort(ListNode *left,ListNode *start,ListNode *end,ListNode *right)
{
ListNode *pre=start;
ListNode *cur=(*start).next;
ListNode *next=NULL;
while(cur!=right)
{
next=(*cur).next;
(*cur).next=pre;
pre=cur;
cur=next;
}
if(left!=NULL)
(*left).next=end;
(*start).next=right;
}
ListNode *k_inverse(ListNode *head,int k)
{
ListNode *cur=head;
ListNode *next=NULL;
ListNode *pre=NULL;
ListNode *start=NULL;
int i=1;
while(cur)
{
next=(*cur).next;
if(i==k)
{
if(pre==NULL)//这里只执行一次,先让start从1开始,然后head指向3,假设head=1.2.34.5.6.7.8 k=3
{
start=head;
head= cur;
}
else
{
start=(*pre).next;//每次的start=上一节点指向的下一个
head=head;//等会要返回了,一直保持不变了
}
part_sort(pre,start,cur,next);
pre=start;//用来报存上一组k个节点尾节点
i=0;
}
i++;
cur=next;
}
return head;
}
int main()
{
int a[8] ={1,2,3,4,5,6,7,8},b[5]={2,4,6,8,10};
vector<int> arr(a,a+8),brr(b,b+5);
CreatList C;
ListNode *head_a=C.Creat(arr);
print(head_a);
head_a=k_inverse(head_a,3);
print(head_a);
return 0;
}