题解 | #重排链表#
重排链表
https://www.nowcoder.com/practice/3d281dc0b3704347846a110bf561ef6b
/** * struct ListNode { * int val; * struct ListNode *next; * }; */ /** * * @param head ListNode类 * @return void */ void reorderList(struct ListNode* head ) { // write code here printf("fxs =>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\r\n"); struct ListNode* p1 = head; struct ListNode* p2 = head->next; struct ListNode* temp = NULL; struct ListNode* tempsecond = NULL; struct ListNode* p = p1->next; //bug1 : 这里为了应对{1,2,3},之前我令p=p2->next了。 int count = 0; if (p1 == NULL || p2 == NULL || p2->next == NULL) { printf("fxs ====>\r\n"); return; } while (p1 != NULL && p2 != NULL) { if (p2->next == NULL) { //bug2 : {1,2} 或者 {1,2,3,4} return; } while (p != NULL && p->next != NULL) { temp = p; p = p->next; } count++; printf("count = %d, p->val = %d\r\n", count, p->val); //此时P就是最后一个节点,temp是最后一个节点。 temp->next = NULL; //将节点插入p1和p2两个节点中间。 p1->next = p; p->next = p2; //将p1和p2都往后移动,但是注意p1应该指向p2,而不是p2后面的节点。 p1 = p2; p2 = p2->next; //这里有点问题,p没有更新 里面的循环每次都要更新才对 p = p2; } }