2018-10-22领扣链表重排

分为三步:

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就是是线偏右      //的那个节点  


}  

你可能感兴趣的:(2018-10-22领扣链表重排)