题目
对单链表每k个节点反转,k取4,有:
1 2 3 4 5 6 -> 4 3 2 1 6 5
1 2 3 4 5 6 7 8 -> 4 3 2 1 8 7 6 5
1 2 -> 2 1
1 -> 1
代码
#include <vector>
#include <iostream>
using namespace std;
struct node{
int val;
node *next;
node(int a){
val = a;
next = nullptr;
}
};
node *reverse(node *head, int k){
int num = 0;
node *cur = head, *newhead = nullptr;
while (cur != nullptr){
num++;
cur = cur->next;
}
int m = num / k, n = num % k;
cur = nullptr;
node *temphead = nullptr, *prehead = nullptr;
for (int i = 0; i < m; ++i){
temphead = head;
prehead = head;
head = head->next;
for (int j = 0; j < k - 1; ++j){
node *temp = head->next;
head->next = prehead;
prehead = head;
head = temp;
}
if (i == 0){
newhead = prehead;
}
if (cur != nullptr){
cur->next = prehead;
}
cur = temphead;
if (i == m - 1){
cur->next = nullptr;
}
}
if (n){
temphead = head;
prehead = head;
head = head->next;
for (int j = 0; j < n - 1; ++j){
node *temp = head->next;
head->next = prehead;
prehead = head;
head = temp;
}
if (m == 0){
newhead = prehead;
}
if (cur != nullptr){
cur->next = prehead;
}
temphead->next = nullptr;
}
return newhead;
}
void print(node *head){
node *cur = head;
while (1){
if (cur != nullptr){
cout << cur->val << " ";
cur = cur->next;
}
else{
cout << endl;
break;
}
}
}
int main(){
node *head = new node(1);
node *cur = head;
for (int i = 2; i < 5; ++i){
cur->next = new node(i);
cur = cur->next;
}
print(head);
node *newhead = reverse(head, 4);
print(newhead);
return 1;
}