leetcode:Reverse Nodes in k-Group(以k为循环节反转链表)【面试算法题】

原创 2013年12月02日 23:08:39

题目:

Given a linked list, reverse the nodes of a linked list k at a time and return its modified list.

If the number of nodes is not a multiple of k then left-out nodes in the end should remain as it is.

You may not alter the values in the nodes, only nodes itself may be changed.

Only constant memory is allowed.

For example,
Given this linked list: 1->2->3->4->5

For k = 2, you should return: 2->1->4->3->5

For k = 3, you should return: 3->2->1->4->5

题意:给定一个链表和一个数字k,以k为循环节,反转链表中的元素,如果剩下的长度不足k,则最后一部分不进行反转。





先计算链表的长度,长度除以循环节长度,统计要进行链表反转的次数。

每个循环节中的链表反转用三个指针去维护。

当操作是第一个循环节时,需要改变head指针的值。

之后每个循环节反转结束后用ph和pe两个指针去维护循环节之间的指针连接。

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode *reverseKGroup(ListNode *head, int k) {
        ListNode *p1,*p2,*p3,*ph,*pe;
        if(head==NULL)return NULL;
        int n=0,i,j;
        p1=head;
        if(k==1)return head;
        while(p1) {
            n++;
            p1=p1->next;
        }
        p1=head;
        p2=p1->next;
        if(p2)p3=p2->next;
        for(i=0;i<n/k;++i) {
            for(j=1;j<k;++j) {
                p2->next=p1;
                p1=p2;
                p2=p3;
                if(p3)p3=p3->next;
            }
            if(i==0) {
                ph=head;
                ph->next=p2;
                pe=p2;
                head=p1;                
            }
            else {
                ph->next=p1;
                ph=pe;
                ph->next=p2;
                pe=p2;
            }
            p1=p2;
            if(p2)p2=p2->next;
            if(p3)p3=p3->next;
        }
        return head;
    }
};
// blog.csdn.net/havenoidea  


题解目录

[leetcode]Reverse Nodes in k-Group 反转以k个节点为一组的链表

Given a linked list, reverse the nodes of a linked list k at a time and return its modified list. ...
  • jhbxlx
  • jhbxlx
  • 2014年08月04日 07:22
  • 639

Kmp找字符串循环节——Period ( POJ 1961 )

题目链接: http://poj.org/problem?id=1961 分析: 给出一个字符串长度为N,从左变开始取2~N个字符出来构成一个新字符串,若新字符串能被一个最短的循环节构成则输出新字...
  • FeBr2
  • FeBr2
  • 2016年07月15日 15:09
  • 1054

算法导论 O(n)时间内反转单链表

算法导论 O(n)时间内反转单链表1. 算法导论原题 Give a O(n) time nonrecursive procedure that reverses a singly linked l...
  • sinat_24229853
  • sinat_24229853
  • 2015年09月18日 16:45
  • 754

Leetcode:在线编程网站-各大IT公司的笔试面试题

leetcode 是一个美国的在线编程网站,上面主要收集了各大IT公司的笔试面试题,对于应届毕业生找工作是一个不可多得的好帮手。 这个网站的的好处在于它会告诉你测试数据以及你的输出和正确的输出是什么...
  • huixingshao
  • huixingshao
  • 2015年02月09日 13:40
  • 13961

每日算法之二十三:Reverse Nodes in k-Group

Given a linked list, reverse the nodes of a linked list k at a time and return its modified list. ...
  • yapian8
  • yapian8
  • 2014年05月31日 11:18
  • 694

算法分析与设计课程(7):【leetcode】Reverse Nodes in k-Group

Description: Given a linked list, reverse the nodes of a linked list k at a time and return its...
  • lr787558718
  • lr787558718
  • 2017年04月07日 14:57
  • 78

LeetCode 各题目难度已经面试频率

1 Two Sum 2 5 array sort         set Two Pointers ...
  • u013195320
  • u013195320
  • 2014年03月20日 23:07
  • 1307

python再计算无限循环小数的循环节

循环节: 如果无限小数的小数点后,从某一位起向右进行到某一位止的一节数字循环出现,首尾衔接,称这种小数为循环小数,这一节数字称为循环节。 #寻找1000以内的n,使得1/n的循环小...
  • baidu_38127162
  • baidu_38127162
  • 2017年05月01日 23:02
  • 753

面试常考算法题总结(二)

题目链接:试卷1和试卷2。 题目1:对于一个无序数组A,请设计一个算法,求出需要排序的最短子数组的长度。给定一个整数数组A及它的大小n,请返回最短子数组的长度。 测试样例: [1,5,3,4,2...
  • JIEJINQUANIL
  • JIEJINQUANIL
  • 2016年08月30日 17:41
  • 1048

[算法]实现单链表的反转

实现链表的反转解题思路: 为了正确反转一个链表,需要调整指针的指向。举例说明,例如i,m,n是三个相邻的结点,假设经过若干步操作,已经把结点i之前的指针调整完毕,这些结点的next指针都指向前面一...
  • CodeEmperor
  • CodeEmperor
  • 2016年05月06日 18:32
  • 1936
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:leetcode:Reverse Nodes in k-Group(以k为循环节反转链表)【面试算法题】
举报原因:
原因补充:

(最多只允许输入30个字)