链接:143. 重排链表 - 力扣(LeetCode)
这是一道操作链表的题。按照要求,我们可以将解题的步骤分成三步。
1.找链表中间结点(我使用了快慢指针寻找),并断开。
2.现在有2链表,将后段链表进行翻转操作
3.从两个链表的头开始遍历链表,将后段的链表一个结点一个结点插入前段的链表
我的代码:
class Solution {
public:
void reorderList(ListNode* head) {
if(head->next==nullptr) return;
ListNode *p1,*p2;
p1=p2=head;
while(p1->next!=nullptr)
{
p1=p1->next;
if(p1->next==nullptr) break;
p1=p1->next;
p2=p2->next;
}
ListNode *a,*b,*c;
a=nullptr; b=p2->next; c=b->next;
while(c!=nullptr)
{
b->next=a;
a=b;
b=c;
c=c->next;
}
b->next=a;
p2->next=nullptr;
p1=head;
p2=p1->next;
c=b->next;
while(b!=nullptr)
{
p1->next=b;
b->next=p2;
p1=p2;
b=c;
if(c==nullptr) break;
p2=p2->next;
c=c->next;
}
}
};