分为三步:
1 首先找到链表的中间位置,从其后面拆开分成两半,保存要反向插入的后半部分的首节点,并把前半部分的最后一个节点的next指针置为NULL
2 然后将后半部分链表反转,并保存反转后新链表的首节点
3 最后从反转后的链表首节点开始,依次间隔一个位置插入到前半部分链表中
其中链表逆序的伪代码如下(假设当前节点为root,pre是root 的前驱,next为root的后继,以此类推):
while(root->next){
next=root->next;
root->next=pre;
pre=root;
root=next;
}
以及使用快慢指针找到链表的中点:
ListNode* findMidNode(ListNode* head)
{
ListNode *slow, *fast;
slow = head;
fast = head;
while (fast && fast->next)
{
slow = slow->next;
fast = fast->next-next;
}
return slow;
//这里注意的是,如果fast非空,说明
//奇数个节点,slow就是中间那个节点
//如下fast为空,那么slow就是是线偏右 //的那个节点
}