给定一个单链表 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 浏览: 109
已知单链表L为按值递增有序的,编写算法将数据元素值在区间[e1,e2]内的所有结点取出建立一个新单链表L1
这道题目可以使用快慢指针的方法,先找到链表的中点,然后将链表分为两个部分,将后半部分反转,最后将两个链表合并即可。
具体步骤如下:
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;
}
}
};
```
阅读全文