思路1:
创建两个链表进行奇偶元素提取,最后将链表连接起来,要创建一个偶数头指针用于连接
代码1:
class Solution {
public:
ListNode* oddEvenList(ListNode* head) {
if (head == nullptr)
return head;
ListNode* evenHead = head->next;
ListNode* odd = head;
ListNode* even = evenHead;
while (even && even->next) {
odd->next = even->next;//1->3
odd = odd->next;//odd指针移动
even->next = odd->next;//2->4
even = even->next;//even指针移动
}
odd->next = evenHead;
return head;
}
};
思路2:
使用后插法
- slow指向头结点,fast指向第二个奇元素
- 原链表删除第二个奇元素
- 第二个奇元素作为新结点插入slow后面
- head->next==NULL停止while
- 注意循环内存在一次指针移动,对这次指针移动要做出界处理
代码2:
public:
ListNode* oddEvenList(ListNode* head) {
ListNode *Head=head;//创建头指针指向head
ListNode *slow=head,*fast;
while(head&&head->next){
head=head->next;//移动到奇结点前驱
if(!head->next) break;//防止指针出界
fast = new ListNode;fast=head->next;//获取奇结点
head->next=head->next->next;//删除奇结点
fast->next=slow->next;slow->next=fast;//插入奇结点
slow=slow->next;//插入位置前移
}
return Head;
}
};