剑指 Offer II 026. 重排链表
题目:
给定一个单链表 L 的头节点 head ,单链表 L 表示为:
L0 → L1 → … → Ln-1 → Ln
请将其重新排列后变为:
L0 → Ln → L1 → Ln-1 → L2 → Ln-2 → …
不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
解题思路:
1.将链表拆成前后单独的两个链表
2.将后半部分的链表翻转
3.将新的两个链表轮流接连起来
代码如下:
class Solution {
public:
//翻转链表函数
ListNode* reverse(ListNode* head){
ListNode* pre=nullptr;
ListNode* cur=head;
while(cur){
ListNode* temp=cur->next;
cur->next=pre;
pre=cur;
cur=temp;
}
return pre;
}
void reorderList(ListNode* head) {
ListNode* temp=new ListNode(0);
temp->next=head;
//通过快慢两个指针找到链表的中间索引。
ListNode* slow=temp;
ListNode* fast=temp;
while(fast!=nullptr && fast->next!=nullptr){
slow=slow->next;
fast=fast->next->next;
}
delete temp;
temp=nullptr;
ListNode* headB=slow->next;
slow->next=nullptr;
//翻转后半部分的链表
ListNode* p2=reverse(headB);
ListNode* p1=head;
ListNode* p3=head;
//将链表轮流连接起来
while(p2){
p3=p1->next;
p1->next=p2;
p1=p2;
p2=p3;
}
}
};