1. 题目来源
链接:lc328. 奇偶链表
2. 题目说明
3. 题目解析
细节蛮多的,挺不错的一道题。
把原单链表按照奇偶位置摘成两个链表就行了,奇数链表的 next
指向偶数链表的 head
就行了。
建立四个指针分别记录奇链表头、尾,偶链表头、尾。遍历一遍单链表,一直修改尾指针就行了。
代码:
/**
* Definition for singly-linked list.
* 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) {
if (!head || !head->next) return head;
auto a = head, b = a;
auto c = head->next, d = c;
for (auto p = head->next->next; p; ) {
b = b->next = p;
p = p->next;
if (p) {
d = d->next = p;
p = p->next;
}
}
b->next = c;
d->next = NULL; // 注意置为 NULL
return a;
}
};