给定一个带头结点的单链表和一个整数 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(gcc)代码
时间: 2024-09-24 11:21:29 浏览: 31
以下是使用 C 语言(gcc 编译器)实现链表每隔 k 个节点反转的一个简单算法。我们将使用三个指针 `prev`, `current`, 和 `next` 来分别表示前一个节点、当前节点和下一个节点:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义链表结构体
struct ListNode {
int val;
struct ListNode *next;
};
// 反转前k个节点
void reverseKGroup(struct ListNode* head, int k) {
if (head == NULL || head->next == NULL || k <= 1) return; // 如果链表为空,只有一个节点,或者k小于等于1,无需操作
// 初始化指针
struct ListNode *prev = NULL, *current = head, *start = NULL;
for (int i = 0; current != NULL && i < k; ++i) {
next = current->next; // 记录当前节点的下一个节点
current->next = prev; // 将当前节点指向前一个节点
prev = current; // 移动前一个节点到当前节点
current = next; // 移动当前节点到下一位
}
// 如果还需要继续处理剩下的节点,进入递归
if (next != NULL) {
start = current;
reverseKGroup(next, k); // 对剩余部分进行同样的操作
prev->next = start; // 合并反转后的部分到原链表
} else {
prev->next = head; // 如果已经处理完所有k个节点,直接连接回头节点
}
}
// 创建链表并打印
void createList(int arr[], int n, struct ListNode** list) {
*list = NULL;
for (int i = 0; i < n; i++) {
struct ListNode* node = (struct ListNode*)malloc(sizeof(struct ListNode));
node->val = arr[i];
node->next = (*list);
*list = node;
}
}
// 打印链表
void printList(struct ListNode* head) {
while (head) {
printf("%d -> ", head->val);
head = head->next;
}
printf("NULL\n");
}
int main() {
int arr[] = {1, 2, 3, 4, 5, 6};
int n = sizeof(arr) / sizeof(arr[0]);
struct ListNode* head = NULL;
createList(arr, n, &head);
int k = 3;
printf("Original List: ");
printList(head);
reverseKGroup(head, k);
printf("Reversed every %d nodes: ", k);
printList(head);
return 0;
}
```
这个程序首先创建一个链表,然后调用 `reverseKGroup` 函数按照指定的间隔 k 进行节点反转。`main` 函数用于测试此功能,并展示结果。
阅读全文