给一个链表 L: L0→L1→…→Ln-1→Ln,
需要返回: L0→Ln→L1→Ln-1→L2→Ln-2→…
思路1:
void reorderList(ListNode* head) { ListNode* p=head; while(p&&p->next) { ListNode* pnext=p->next; //记下下一个节点 ListNode* temp=p; if(p->next->next==NULL) { p=p->next; } else { while(temp->next&&temp->next->next) { temp=temp->next; }//让temp指向倒数第二个节点 p->next=temp->next; //指向最后一个节点 temp->next=NULL; //删除最后一个节点 p=p->next; //连接后面的节点 p->next=pnext; p=p->next; } } if(p) { p->next=NULL; }}
思路2:
if(head == NULL){ return; } ListNode* p1 = head; ListNode* p2 = splitList(head); p2 = revertList(p2); mergeList(p1, p2); } void mergeList(ListNode * p1, ListNode * p2){ //合并链表 while(p2 != NULL){ ListNode* tmp = p2; p2 = p2->next; tmp->next = p1->next; p1->next = tmp; p1 = p1->next; p1 = p1->next; }; } ListNode* splitList(ListNode *head){ //去后半部分链表 ListNode* slow = new ListNode(0); slow->next = head; ListNode* fast = slow; while(fast->next != NULL && fast->next->next != NULL){ slow = slow->next; fast = fast->next; fast = fast->next; } if(fast->next != NULL){ slow = slow->next; fast = fast->next; } ListNode* tmp = slow->next; slow->next = NULL; return tmp; } ListNode* revertList(ListNode* head){ //翻转链表 if(head == NULL){ return NULL; } ListNode* p = head->next; head->next = NULL; while(p != NULL){ ListNode* tmp = p; p = p->next; tmp->next = head; head = tmp; } return head; }
时间: 2024-10-24 13:16:16