数据结构与算法整理

链表-节点k个一组翻转

2020-03-07  本文已影响0人  茶还是咖啡

给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。

eg:
给你这个链表:1->2->3->4->5
当 k = 2 时,应当返回: 2->1->4->3->5
当 k = 3 时,应当返回: 3->2->1->4->5

可以具体把分为如下几步:

  1. 判断当前链表的长度是否大于k
  2. 如果大于k,将链表的前k个节点进行翻转
    将翻转后的链表尾插到新的链表中。并重复上面的步骤。
  3. 如果当前链表的长度不足k,直接将当前链表尾插到新链表上,结束。

code

ElemSN* flipNode(ElemSN* head,int k){
    if(head==NULL||k<=0){
        return NULL;
    }
    int count=0;
    ElemSN *p=head,*q=head,*hn=NULL,*tail=NULL,*hTemp=NULL,*tempTail=NULL;
    while (head) {
        q=head;
        count=0;
        while(count<k&&q!=NULL){
            count++;
            q=q->next;
        }
        if(count==k){
            // 链表满足翻转条件
            hTemp=NULL;
            tempTail=head;
            count=0;
            while (count<k) {
                p=head;
                head=head->next;
                count++;
                p->next=hTemp;
                hTemp=p;
            }
        }else{
            hTemp=head;
        }
        if(hn==NULL){
            hn=hTemp;
            tail=tempTail;
        }else{
            tail->next=hTemp;
            if(count==k){
                tail=tempTail;
            }else{
                head=NULL;
            }
        }
    }
    return hn;
}
上一篇 下一篇

猜你喜欢

热点阅读