题解 | #链表的奇偶重排#
链表的奇偶重排
https://www.nowcoder.com/practice/02bf49ea45cd486daa031614f9bd6fc3
/** * struct ListNode { * int val; * struct ListNode *next; * ListNode(int x) : val(x), next(nullptr) {} * }; */ class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param head ListNode类 * @return ListNode类 */ ListNode* oddEvenList(ListNode* head) { // write code here //创建一个偶数链表,然后让奇数链表的最后一位放到这里来 //方法2就是使用vector进行遍历 if(head == nullptr) return head;//边界条件 if(head->next == nullptr) return head;//边界条件 ListNode* fastPtr = head->next; ListNode* slowPtr = head; //将偶数节点连接起来 ListNode* newList = new ListNode(-1); ListNode* cur = newList; //思路:把fastPtr双步叠加,然后删除中间节点,同时创建一个偶数链表 while(fastPtr->next != nullptr) { //为下一次节点进行预留,提前保存 ListNode* next = fastPtr->next->next; ListNode* temp = new ListNode(fastPtr->val); cur->next = temp; cur = cur->next; //将奇数节点也连接起来 slowPtr->next = fastPtr->next; slowPtr = slowPtr->next; delete fastPtr; //为了防止数组越界,当慢指针下一个不为空,则将fastPtr赋值,若是空,那么就将快指针赋空 if(slowPtr->next != nullptr) { fastPtr = next; } else { fastPtr = nullptr; break; } } //防止最后一个偶数节点无法进入,所以需要将它到这里来 if(fastPtr != nullptr) { ListNode* temp = new ListNode(fastPtr->val); cur->next = temp; cur = cur->next; delete fastPtr; //fastPtr = fastPtr->next; } slowPtr->next = newList->next; return head; } };