c语言 循环链表反转
时间: 2023-09-13 10:00:41 浏览: 117
链表反转的C语言程序
循环链表是一种特殊的链表,它的最后一个节点指向首节点,形成一个循环。要对循环链表进行反转,我们需要修改指针的指向关系。
首先,我们需要定义一个指向当前节点的指针,初始时指向循环链表的首节点。然后,我们根据当前节点的指针将链表逐个反转。
具体的反转步骤如下:
1. 首先,检查循环链表是否为空,若为空,则无需反转,直接返回。
2. 将当前节点的指针指向下一个节点。
3. 将下一个节点的指针指向前一个节点。
4. 将前一个节点的指针指向当前节点。
5. 将当前节点的指针指向下一个节点。
6. 重复步骤2-5,直至当前节点指向了起始节点,表示反转完成。
下面是使用C语言实现循环链表反转的代码示例:
```c
#include <stdio.h>
struct Node {
int data;
struct Node* next;
};
// 循环链表反转函数
void reverseLinkedList(struct Node** head) {
if (*head == NULL) {
printf("链表为空,无需反转\n");
return;
}
struct Node* current = *head;
struct Node* nextNode = NULL;
struct Node* prevNode = NULL;
do {
nextNode = current->next;
current->next = prevNode;
prevNode = current;
current = nextNode;
} while (current != *head);
(*head)->next = prevNode;
*head = prevNode;
}
int main() {
// 创建循环链表
struct Node* node1 = (struct Node*)malloc(sizeof(struct Node));
struct Node* node2 = (struct Node*)malloc(sizeof(struct Node));
struct Node* node3 = (struct Node*)malloc(sizeof(struct Node));
node1->data = 1;
node2->data = 2;
node3->data = 3;
node1->next = node2;
node2->next = node3;
node3->next = node1;
// 反转循环链表
reverseLinkedList(&node1);
// 输出反转后的循环链表
struct Node* current = node1;
do {
printf("%d ", current->data);
current = current->next;
} while (current != node1);
// 释放内存
free(node1);
free(node2);
free(node3);
return 0;
}
```
上述代码中,我们在主函数中创建一个带有三个节点的循环链表,并调用reverseLinkedList函数对其进行反转。最后,我们通过遍历循环链表输出反转后的结果。
阅读全文