给定一个单链表 l \n1\n\t\n →l \n2\n\t\n →⋯→l \nn−1\n\t\n →l \nn\n\t\n ,请编写程序将链表重新排列为 l \nn\n\t\n →l \n1\n\t\n →l \nn−1\n\t\n →l
时间: 2023-04-28 13:02:47 浏览: 106
这道题目可以使用快慢指针的方法,先找到链表的中点,然后将链表分为两个部分,将后半部分反转,最后将两个链表合并即可。
具体步骤如下:
1. 使用快慢指针找到链表的中点,将链表分为两个部分。
2. 反转后半部分链表。
3. 将两个链表合并,即将后半部分链表的每个节点插入到前半部分链表的相邻两个节点之间。
4. 返回新的链表头节点。
代码实现如下:
```
class Solution {
public:
void reorderList(ListNode* head) {
if (!head || !head->next) return;
// 找到链表的中点
ListNode* slow = head;
ListNode* fast = head;
while (fast->next && fast->next->next) {
slow = slow->next;
fast = fast->next->next;
}
// 将链表分为两个部分
ListNode* head1 = head;
ListNode* head2 = slow->next;
slow->next = nullptr;
// 反转后半部分链表
ListNode* prev = nullptr;
ListNode* curr = head2;
while (curr) {
ListNode* next = curr->next;
curr->next = prev;
prev = curr;
curr = next;
}
head2 = prev;
// 将两个链表合并
ListNode* p1 = head1;
ListNode* p2 = head2;
while (p2) {
ListNode* next1 = p1->next;
ListNode* next2 = p2->next;
p1->next = p2;
p2->next = next1;
p1 = next1;
p2 = next2;
}
}
};
```
阅读全文