重排链表c语言pta
时间: 2023-09-30 13:03:15 浏览: 163
要重排链表,可以采取以下步骤:
1. 定义链表节点结构体,包含一个值和一个指向下一个节点的指针。
```c
struct ListNode {
int val;
struct ListNode *next;
};
```
2. 创建一个辅助函数,用于翻转链表的后半部分。
```c
struct ListNode* reverseList(struct ListNode* head) {
struct ListNode *prev = NULL;
struct ListNode *curr = head;
struct ListNode *next = NULL;
while (curr != NULL) {
next = curr->next;
curr->next = prev;
prev = curr;
curr = next;
}
return prev;
}
```
3. 定义一个辅助函数,用于合并两个链表。
```c
void mergeLists(struct ListNode* l1, struct ListNode* l2) {
struct ListNode *temp1;
struct ListNode *temp2;
while (l2 != NULL) {
temp1 = l1->next;
temp2 = l2->next;
l1->next = l2;
l2->next = temp1;
l1 = temp1;
l2 = temp2;
}
}
```
4. 定义主函数,实现链表重排。
```c
void reorderList(struct ListNode* head) {
if (head == NULL || head->next == NULL) {
return;
}
// 找到链表中点
struct ListNode *slow = head;
struct ListNode *fast = head;
while (fast->next != NULL && fast->next->next != NULL) {
slow = slow->next;
fast = fast->next->next;
}
// 翻转链表的后半部分
struct ListNode *reversed = reverseList(slow->next);
slow->next = NULL;
// 合并前半部分和翻转后的后半部分
mergeLists(head, reversed);
}
```
这样,当你有一个链表头节点 `head` 后,你可以调用 `reorderList(head)` 函数来重排链表。请注意,在调用函数之前,请确保该链表的节点顺序是正确的。
希望这能帮到你!如果有任何问题,请随时提问。
阅读全文