链表重排,这种题一定要画图,画着画着思路就出来了
边界条件:如果链表为空,或链表只有一个结点,或只有两个结点,直接返回head;
设置双指针,p指向奇数结点,q指向偶数结点,同时设置一个evenhead结点指向q,作为偶数链的头结点
1)让奇数结点指向偶数结点的下一个结点,同时p指针后移;
2)让偶数结点指向奇数结点的下一个结点,同时q指针后移;
3)以上两步做循环,直到奇数结点的下一个结点或偶数结点的下一个结点不存在,则退出
这里循环到最后有两种情况:
1.是原链表有奇数个结点,此时,p指向最后一个结点,q指向空结点
2.是原链表有偶数个结点,此时,p指向倒数第二个结点,q指向最后一个结点
这两种情况,p都指向奇数链表的最后一个结点,而偶数链表的尾结点的next都为nullptr
所以这两种情况可以直接合并处理,直接令奇数链表的尾结点指向偶数链表的头结点即可
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param head ListNode类
* @return ListNode类
*/
ListNode* oddEvenList(ListNode* head) {
// write code here
// 链表的奇偶重排
if(!head || !head->next || !head->next->next) return head;
ListNode *p = head, *q = head->next, *evenhead = q;
while (p->next && q->next) {
p->next = q->next;
p = p->next;
q->next = p->next;
q = q->next;
}
p->next = evenhead;
return head;
}
};
京公网安备 11010502036488号