C++程序 用于在给定大小的组中翻转链表–第2部分
上一集中,我们介绍了如何在C++中翻转给定链表。这一集中,我们将介绍如何在给定大小的组中翻转链表。
假设我们有一个大小为k的整数,代表需要翻转的链表中的节点数。我们的任务是对给定的链表进行k个节点的翻转,如果节点数少于k个,则不翻转最后的节点。
让我们看看C++代码如何实现这个任务:
#include<iostream>
using namespace std;
struct node{
int value;
node* next;
};
node* reverseList(node* head, int k){
node *pre=head, *cur=head;
for(int i=0; i<k; i++){ //判断节点数是否足够
if(cur==NULL){
return head;
}
cur=cur->next;
}
cur=head;
node* next=NULL;
for(int i=0; i<k; i++){ //翻转前k个节点
next=cur->next;
cur->next=pre;
pre=cur;
cur=next;
}
head->next=reverseList(cur, k); //递归翻转后面的节点
return pre;
}
void printList(node* head){
while(head!=NULL){
cout<<head->value<<" ";
head=head->next;
}
cout<<endl;
}
int main(){
node* head=new node;
head->value=1;
node* cur=head;
for(int i=2; i<10; i++){
node* tmp=new node;
tmp->value=i;
cur->next=tmp;
cur=tmp;
}
cout<<"Original list: ";
printList(head);
head=reverseList(head, 3);
cout<<"After reversal: ";
printList(head);
return 0;
}
在上面的代码中,我们通过循环判断是否存在足够的节点进行翻转。然后我们按顺序遍历前k个节点并进行翻转。接下来,我们通过递归对后面的元素进行翻转。
以下是示例输出:
Original list: 1 2 3 4 5 6 7 8 9
After reversal: 3 2 1 6 5 4 9 8 7
我们可以看到,原始列表是1,2,3,4,5,6,7,8,9。以大小3为组的翻转后,我们得到了3,2,1,6,5,4,9,8,7。
结论
通过上面的示例,我们已经学习了如何在给定大小的组中翻转链表。在本文中,我们使用C++编写了代码进行反转,并演示了如何递归反转给定列表中的剩余节点。