# 328. 奇偶链表
给定单链表的头节点 head ,将所有索引为奇数的节点和索引为偶数的节点分别组合在一起,然后返回重新排序的列表。
# 解题思路
- 遍历链表,并对当前节点的索引进行判断,如果是奇数就将其移动到奇数项的末尾,并更新奇数的末尾,如果是偶数则保持不动。
class Solution {
public:
ListNode* oddEvenList(ListNode* head) {
ListNode* new_head = new ListNode(0, head);
ListNode* last_odd = new_head;
ListNode* prev = new_head;
ListNode* cur = head;
ListNode* next;
bool has_even = false;
int i = 1;
while (cur) {
if ((i++ % 2 != 0)) {
// 奇数
if (has_even) {
next = cur->next;
prev->next = next;
cur->next = last_odd->next;
last_odd->next = cur;
last_odd = cur;
// prev = cur;
cur = next;
} else {
last_odd = cur;
prev = cur;
cur = cur->next;
}
} else {
prev = cur;
cur = cur->next;
has_even = true;
}
}
return new_head->next;
}
};
另外,因为相邻节点的奇偶性不同,所以可以将奇数节点和偶数节点分离成奇数链表和偶数链表,然后将偶数链表连接在奇数链表之后,合并后的链表即为结果链表。具体可参考官方题解。