题解 | #链表中的节点每k个一组翻转#

链表中的节点每k个一组翻转

http://www.nowcoder.com/practice/b49c3dc907814e9bbfa8437c251b028e

/**
 * struct ListNode {
 *  int val;
 *  struct ListNode *next;
 * };
 */
struct ListNode*partreverse(struct ListNode*head,int m,int n)
{
    struct ListNode *p = head, *pre, *temp, *s, *r;
    int i, j;
    s = head; //初始化s             
      for (i = 1; i < m; i++)
    {
        s = p;
        p = p->next;
    }
    r = pre = p;//找到要翻转的位置
    p = p->next;//将p指向下一位准备翻转
    for (j = m; j < n; j++)
    {
        temp = pre;//保留其前节点的位置
        pre = p;//将pre更新
        p = p->next;//更新p
        pre->next = temp;//将后一节点的next指向前一节点
    }//for循环使链表反转
    s->next = pre;//反转过后使前节点(s)指向翻转后的头结点
    r->next = p;//翻转后的尾结点指向后面的节点(p)
    if (m == 1)
        return pre;//特殊情况,当m == 1时,头结点发生变化,此时的头为pre
    return head;//一般情况,返回head
}
class Solution {
  public:
    ListNode* reverseKGroup(ListNode* head, int k) {
        // write code here
        struct ListNode* p = head;//初始化p
        int n = 0;//用来给节点计数
        while (p != NULL)
        {
            p = p->next;
            n++;
        }
        if(n == 0 || k > n)
            return head;
                //判断特殊情况:当链表为空或者k>n时,直接返回原链表
        p = head;//重新初始化
        int times = n/k;//计算需要翻转的次数
        int j ,t = 1;//j,t为循环变量
        for(j = 0;j < times;j++)
        {
            p = partreverse(p,t,t+k-1);//翻转第t到t+k-1项,并且返回头指针
            t += k;//更新t,准备翻转下一组
        }
        return p;
                //最后,因为翻转的过程中head发生变化,而p始终为头指针,故返回p
    }
};

全部评论

相关推荐

废铁汽车人:秋招真是牛鬼蛇神齐聚一堂
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务