题目大意:给定一个链表和一个k值,要求把这个链表每段长度为k的节点反转,不够k值长度的片断不反转。
解题思路:简单的链表操作,保证O(n)时间完成。
#include <cstdio>
#include <iostream>
using namespace std;
struct ListNode {
int val;
ListNode *next;
ListNode(int x): val(x), next(NULL) {}
};
class Solution {
public:
ListNode *reverseKGroup(ListNode *head, int k) {
if(head == NULL)
return NULL;
ListNode *reverse_tail = NULL;
ListNode *pre_reverse_tail = NULL;
ListNode *cur = head;
ListNode *pre = NULL;
int len = 0;
while(cur != NULL) {
len++;
cur = cur->next;
}
int times = len / k;
if(times == 0)
return head;
int i = 0;
cur = head;
while(cur != NULL && times != 0) {
i++;
if(1 == i) {
reverse_tail = cur;
pre = NULL;
}
if(i == k) {
if(times == len / k)
head = cur;
times--;
if(pre_reverse_tail != NULL) {
pre_reverse_tail->next = cur;
}
pre_reverse_tail = reverse_tail;
i = 0;
}
ListNode *tmp = cur;
tmp->next = pre;
pre = tmp;
cur = cur->next;
}
if(cur != NULL) {
pre_reverse_tail->next = cur;
}
return head;
}
};