给定一个单链表 L 1 →L 2 →⋯→L n−1 →L n ,请编写程序将链表重新排列为 L n →L 1 →L n−1 →L 2 →⋯。例如:给定L为1→2→3→4→5→6,则输出应该为6→1→5→2→4→3用c语言
时间: 2024-09-06 16:04:50 浏览: 156
在C语言中,你可以通过迭代的方式来解决这个问题。这里是一个简单的解决方案,使用三个指针,两个用来遍历原链表,第三个用来保存当前节点并将其加入到新链表的末尾:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义链表结构
typedef struct Node {
int data;
struct Node* next;
} Node;
// 创建新链表头结点
Node* createNewHead() {
return (Node*)malloc(sizeof(Node));
}
// 插入节点到新链表
void insertInOrder(Node** head, Node* current) {
if (*head == NULL) {
*head = current;
} else {
Node* last = *head;
while (last->next != NULL) {
last = last->next;
}
last->next = current;
}
}
// 重新排列链表
void reverseRotate(Node** head) {
if (*head == NULL || (*head)->next == NULL) {
return; // 如果链表只有一个元素或者为空,无需操作
}
Node* fast = *head;
Node* slow = *head;
// 找到中间节点
while (fast->next->next != NULL) {
fast = fast->next->next;
slow = slow->next;
}
// 从中间节点开始交换
slow->next = *head;
fast->next = NULL;
// 将剩余部分接到新链表的尾部
insertInOrder(head, *head);
}
// 打印链表
void printList(Node* node) {
while (node != NULL) {
printf("%d ", node->data);
node = node->next;
}
printf("\n");
}
int main() {
// 初始化示例链表
Node* list = createNewHead();
list->data = 1;
list->next = createNewHead();
list->next->data = 2;
// ...继续添加其他节点...
printf("Original List:\n");
printList(list);
reverseRotate(&list);
printf("Reversed List:\n");
printList(list);
return 0;
}
```
在这个代码里,`reverseRotate`函数首先找到链表的中间节点,然后改变连接,使得最后的节点连接到头节点,实现了题目所描述的顺序。
阅读全文