您的位置:首页 > 其它

链表的k值逆序

2018-03-18 09:13 218 查看
有一个单链表,请设计一个算法,使得每K个节点之间逆序,如果最后不够K个节点一组,则不调整最后几个节点。例如链表1->2->3->4->5->6->7->8->null,K=3这个例子。调整后为,3->2->1->6->5->4->7->8->null。因为K==3,所以每三个节点之间逆序,但其中的7,8不调整,因为只有两个节点不够一组。
给定一个单链表的头指针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;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: