描述
给你一个链表以及一个k,将这个链表从头指针开始每k个翻转一下。
链表元素个数不是k的倍数,最后剩余的不用翻转。
您在真实的面试中是否遇到过这个题? 是
样例
给出链表 1->2->3->4->5
k = 2
, 返回 2->1->4->3->5
k = 3
, 返回 3->2->1->4->5
题目链接
程序
/**
* Definition of singly-linked-list:
* class ListNode {
* public:
* int val;
* ListNode *next;
* ListNode(int val) {
* this->val = val;
* this->next = NULL;
* }
* }
*/
class Solution {
public:
/**
* @param head: a ListNode
* @param k: An integer
* @return: a ListNode
*/
ListNode *reverse(ListNode *p1, ListNode *p2){
ListNode *p1next = p1->next;//刚开始有一个dummpy节点
ListNode *p2next = p2->next;
ListNode *prev = p2next;
ListNode *p = p1next;
//p1指向p2,整个链表段翻转
while(p != p2next){
ListNode *temp = p->next;
p->next = prev;
prev = p;
p = temp;
}
p1->next = p2;//翻转前的节点指向新节点p2(p2是被翻转后)
return p1next;//返回翻转后的尾节点,即翻转前的头结点
}
ListNode * reverseKGroup(ListNode * head, int k) {
// write your code here
//k为1的时候,直接返回
if(k == 1)
return head;
ListNode *dummpy = new ListNode(0);
dummpy->next = head;
//p1为头,p2为尾
ListNode *p1 = dummpy, *p2 = dummpy;
//找到p2的k个尾部,如果出现null,直接返回head
for(int i = 0; i < k; i++){
if(p2 == NULL)
break;
p2 = p2->next;
}
if(p2 == NULL)
return head;
while(p2 != NULL){
p2 = reverse(p1, p2);//p1为头,p2为尾
for(int i = 0; i < k; i++){
if(p2 == NULL)
break;
p1 = p1->next;
p2 = p2->next;
}
}
return dummpy->next;
}
};