给定一个带头结点的单链表和一个整数 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 15:19:35 浏览: 31
顺序输入数据元素的值建立带头结点的单链表-数据结构第一章
在C语言中,你可以通过迭代或递归的方式来解决这个问题。这里提供一种基于迭代的方法:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义链表结构体
typedef struct ListNode {
int val;
struct ListNode *next;
} ListNode;
// 反转函数,用于处理k个节点
ListNode* reverseKGroup(ListNode* head, int k) {
if (head == NULL || head->next == NULL || k <= 1)
return head; // 如果链表为空或者k小于等于1,直接返回
ListNode *prev = NULL, *curr = head, *temp = NULL;
int count = 0;
while (curr != NULL && count < k) { // 遍历k个节点
temp = curr->next;
curr->next = prev; // 将当前节点指向前一个节点
prev = curr; // 移动prev指针到当前节点
curr = temp; // 移动curr指针到下一个节点
count++;
}
if (count == k) { // 如果遍历了完整的k个节点
// 反转这k个节点并连接回原链表
ListNode* new_head = reverseList(prev);
if (prev->next != NULL)
prev->next->next = new_head;
else
head = new_head;
return head;
} else { // 如果不是完整的k个节点,直接返回原链表
return head;
}
}
// 另一个辅助函数,反转单链表
ListNode* reverseList(ListNode* head) {
ListNode *prev = NULL, *curr = head, *next = NULL;
while (curr != NULL) {
next = curr->next;
curr->next = prev;
prev = curr;
curr = next;
}
return prev;
}
// 主函数测试
int main() {
// 创建示例链表:1 -> 2 -> 3 -> 4 -> 5 -> 6
ListNode* list = malloc(sizeof(ListNode));
list->val = 1;
list->next = malloc(sizeof(ListNode));
list->next->val = 2;
list->next->next = malloc(sizeof(ListNode));
list->next->next->val = 3;
list->next->next->next = malloc(sizeof(ListNode));
list->next->next->next->val = 4;
list->next->next->next->next = malloc(sizeof(ListNode));
list->next->next->next->next->val = 5;
list->next->next->next->next->next = malloc(sizeof(ListNode));
list->next->next->next->next->next->val = 6;
list->next->next->next->next->next->next = NULL;
int k = 3;
list = reverseKGroup(list, k);
// 打印结果链表验证
while (list != NULL) {
printf("%d ", list->val);
list = list->next;
}
return 0;
}
```
阅读全文