【Leetcode】328. 奇偶链表
目录
- 一、题目
- 二、思路
- 2.1 解题思路
- 2.2 代码尝试
- 2.3 疑难问题
- 2.4 AI复盘
- 三、解法
- 四、收获
- 4.1 心得
- 4.2 举一反三
一、题目
二、思路
2.1 解题思路
2.2 代码尝试
/**
* 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) {
int n =head->val%2;
ListNode* p=head->next;
ListNode* pre=head;
ListNode* dummy=new ListNode(0);
ListNode* tail=dummy;
dummy->next=tail;
while(p){
if(p->val%2==n){
//如果和表头一样
pre=p;
p=p->next;
}else{
//和表头不一样,就要移到尾指针
tail->next=p;
tail=p;
pre->next=p->next;
p=p->next;
}
}
//最后将两个链表连接
p->next=dummy->next->next;
return head;
}
};
2.3 疑难问题
2.4 AI复盘
原代码中使用了额外的 dummy 节点和 tail 指针来管理偶数节点,但实际上可以通过两个指针 odd 和 even 来分别管理奇数节点和偶数节点。
一般不会超过两个指针
三、解法
class Solution {
public:
ListNode* oddEvenList(ListNode* head) {
if (head == nullptr) {
return head;
}
ListNode* evenHead = head->next;
ListNode* odd = head;
ListNode* even = evenHead;
while (even != nullptr && even->next != nullptr) {
odd->next = even->next;
odd = odd->next;
even->next = odd->next;
even = even->next;
}
odd->next = evenHead;
return head;
}
};
作者:力扣官方题解
链接:https://leetcode.cn/problems/odd-even-linked-list/solutions/482737/qi-ou-lian-biao-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
四、收获
4.1 心得
其实就是双指针吧,双指针的两种形式,一头一尾向中间遍历,另一种就是两个指针头两条链了