给定一个带头结点的单链表和一个整数 k,要求你将链表中的每 k 个结点做一次逆转。例如给定单链表 1→2→3→4→5→6 和 k=3,你需要将链表改造成 3→2→1→6→5→4;如果 k=4,则应该得到 4→3→2→1→5→6。写一个c语言函数
时间: 2024-09-24 10:20:58 浏览: 46
在C语言中,你可以创建一个递归函数来实现这个功能。首先,我们需要一个结构体表示链表节点,并定义两个辅助函数:`reverseKNodes` 和 `printList` 用于反转和打印链表。
```c
#include <stdio.h>
#include <stdlib.h>
// 链表节点结构体
typedef struct ListNode {
int val;
struct ListNode* next;
} ListNode;
// 反转前k个节点的函数
void reverseKNodes(ListNode** head, int k) {
if (*head == NULL || k <= 1) return; // 如果链表为空或者k小于等于1,直接返回
// 分治法,先处理第一个k个节点,然后递归地处理剩下的部分
ListNode *start = *head;
for (int i = 1; i < k && start->next != NULL; ++i) {
start = start->next;
}
// 将前k个节点翻转
ListNode *prev = NULL, *curr = start;
for (int j = k - 1; curr != NULL; prev = curr, curr = curr->next) {
ListNode* temp = curr->next;
curr->next = prev;
if (temp != NULL) temp->prev = curr; // 翻转后的节点需要保存前一个节点指针
}
if (prev != NULL) prev->next = start; // 与剩余节点连接
// 递归处理剩余的k个节点
reverseKNodes(&start->next, k);
}
// 打印链表函数
void printList(ListNode* node) {
while (node != NULL) {
printf("%d -> ", node->val);
node = node->next;
}
printf("NULL\n");
}
// 主函数测试
int main() {
// 创建示例链表
ListNode* head = malloc(sizeof(ListNode));
head->val = 1;
ListNode* node2 = malloc(sizeof(ListNode));
node2->val = 2;
ListNode* node3 = malloc(sizeof(ListNode));
node3->val = 3;
ListNode* node4 = malloc(sizeof(ListNode));
node4->val = 4;
ListNode* node5 = malloc(sizeof(ListNode));
node5->val = 5;
ListNode* node6 = malloc(sizeof(ListNode));
node6->val = 6;
head->next = node2;
node2->next = node3;
node3->next = node4;
node4->next = node5;
node5->next = node6;
node6->next = NULL;
printf("Original List: ");
printList(head);
int k = 3;
reverseKNodes(&head, k);
printf("After reversing every %d nodes: ", k);
printList(head);
return 0;
}
```
当你运行这个程序,它会展示原始链表以及按照给定k值逆序后的链表。注意这个代码假设头节点有值1,实际应用中可能会有不同的初始化方式。
阅读全文