1、找到后半段链表的起始位置,将后半段结点逐个拆下来用头插法进行反转,
2、然后把反转后的链表结点一个一个插入到前半段链表中,注意间隔一个插一个。
void reorderList(struct ListNode* head ) {
if(head == NULL || head->next == NULL)
return; //空链表或只有一个结点不用改变
struct ListNode* fast = head;
struct ListNode* slow = head;
struct ListNode *p, *r, *s; //临时指针
while(fast->next != NULL && fast->next->next != NULL){ //
fast = fast->next->next; //快指针每次走两步
slow = slow->next; //慢指针每次走一步
}
//结点个数为奇数时,fast停在最后一个结点,slow停在正中间结点,即前半段末尾
//结点个数为偶数时,fast停在倒数第二个结点,slow停在前半段最后一个结点处
//无论奇数还是偶数,后半段链表的第一个结点就是slow的下一个结点
p = slow->next; //后半段起点
slow->next = NULL; //前半段最后一个结点尾指针域置空
struct ListNode* L = NULL; //后半段链表头指针
while(p!=NULL){ //头插法四步曲
r = p->next;
p->next = L;
L = p;
p = r;
}
//反转完之后,头指针L指向第一个结点,即原链表的最后一个结点
s = head; //s指向前半段的第一个结点
//开始逐个插入
while(L != NULL){
r = L->next;
L->next = s->next;
s->next = L;
s = L->next;
L = r;
}
}

京公网安备 11010502036488号