题目描述
给定一个链表,每隔k个元素做一次反转。
Example: Inputs: 1->2->3->4->5->6->7->8->NULL and k = 3 Output: 3->2->1->6->5->4->8->7->NULL.
Inputs: 1->2->3->4->5->6->7->8->NULL and k = 5 Output: 5->4->3->2->1->8->7->6->NULL.
解析
我们在学习链表的创建的时候,有一种方法是头插法, 而我们解决 反转链表元素 的时候也会用这种方法。因此我们也借用这种方法,当我们反转k个元素的时候,我们在把指针从链表的头部移动到尾部 ,然后再用头插法在反转k个元素。依次就能进行局部反转。
时间复杂度:
O
(
n
)
O(n)
O(n)
空间复杂度:
O
(
1
)
O(1)
O(1)
代码
#include<bits/stdc++.h>
using namespace std;
typedef struct Node{
int data;
struct Node *next;
}node, *Link;
node *reverse(Link &L, int k){
int j = 0;
node *p = L, *q;
q = new node;
q->next = NULL;
L = q;
while(p){
node *temp = p;
p = p->next;
temp->next = q->next;
q->next = temp;
j++;
if(j%k == 0){
while(q->next){
q = q->next;
}
}
}
return L->next;
}
node *CreateL(Link &L, int n){ // 头插法建立一个链表。
node *p = new node;
p->next = NULL;
for(int i=0;i<n;i++){
node *temp = new node;
cin>>temp->data;
temp->next = p->next;
p->next = temp;
}
L = p->next;
return L;
}
void print(node *L){
while(L){
printf("%d ", L->data);
L = L->next;
}
putchar('\n');
}
int main(){
node *L;
int n; cin>>n;
L = CreateL(L, n);
int k; cin>>k;
puts("初始 的顺序:"); print(L);
L = reverse(L, k);
puts("倒叙后的顺序:"); print(L);
return 0;
}