问题描述
将链表后半部分的节点插入到前半部分节点,使得链表1->2->3->4变成1->4->2->3,或者1-2->3->4->5变成1->5->2->4->3
根据上述问题可知,将链表的后一半的节点从后往前依次插入到前半部分的节点中间,第一步需要找到中间节点将链表分成两个部分,前半部分的数量是大于或者等于后半部分的,第二步则是将后半部分的链表逆序,第三步就遍历后半部分的链表,将其插入前半部分的各节点中间
寻找中间节点
/*
利用一个空的头节点,加上快慢指针,当快指针或者它的下一个节点指向空,此时慢指针指向的下一个节点,就是后半部分链表的头节点
*/
ListNode* fast = new ListNode(0, head);
ListNode* slow = new ListNode(0, head);
while (fast)
{
if (fast->next != nullptr)
fast = fast->next->next;
else
break;
slow = slow->next;
}
fast = head;
ListNode* cur = slow->next;
slow->next = nullptr;
逆序链表
ListNode* tmp1 = nullptr;
ListNode* tmp2 = cur;
ListNode* tmp3 = cur->next;
while (tmp3)
{
tmp2->next = tmp1;
tmp1 = tmp2;
tmp2 = tmp3;
tmp3 = tmp3->next;
}
tmp2->next = tmp1;
插入节点
ListNode* pre1 = fast; //保存插入节点的前一个节点
ListNode* pre2 = nullptr;//保存插入节点
while (tmp2)
{
fast = fast->next;
pre1->next = tmp2; //插入的前一个节点与插入节点连接
pre2 = tmp2;
tmp2 = tmp2->next;
pre2->next = fast; //插入的节点和后一个节点连接
pre1 = fast;
}