题目来源
题目描述
struct ListNode {
int val;
ListNode *next;
ListNode() : val(0), next(nullptr) {}
ListNode(int x) : val(x), next(nullptr) {}
ListNode(int x, ListNode *next) : val(x), next(next) {}
};
class Solution {
public :
ListNode* oddEvenList(ListNode* head) {
}
};
题目解析
用两个奇偶指针分别指向奇偶节点的起始位置,另外需要一个单独的指针even_head来保存偶节点的起点位置,然后把奇节点的指向偶节点的下一个(一定是奇节点),此奇节点后移一步,再把偶节点指向下一个奇节点的下一个(一定是偶节点),此偶节点后移一步,以此类推直至末尾,此时把分开的偶节点的链表连在奇节点的链表后即可,
class Solution {
public :
ListNode* oddEvenList(ListNode* head) {
if(head == NULL || head->next == NULL || head->next->next == NULL){
return head;
}
ListNode *odd = head; // odd指向奇节点的末尾
ListNode *even = head->next; // even指向偶节点的末尾
ListNode *even_head = even;
while (even && even->next){
odd->next = even->next;
odd = even->next;
even->next = odd->next;
even = even->next;
}
odd->next = even_head;
return head;
}
};
class Solution {
public :
ListNode* oddEvenList(ListNode* head) {
if(head == NULL || head->next == NULL || head->next->next == NULL){
return head;
}
ListNode *odd = head; // odd指向奇节点的末尾
ListNode *even = head->next; // even指向偶节点的末尾
while (even && even->next){ // 偶数节点之后还有节点没有
ListNode *t = odd->next; // 临时保存偶节点的开头
odd->next = even->next; // 奇节点末尾连接【偶节点】第一个节点
even->next = even->next->next; // 偶节点末尾连接【偶节点】第二个节点
odd->next->next = t; // 奇数节点--->偶数节点的开头
odd = odd->next;
even = even->next;
}
return head;
}
};