2023/07/08 leetcode刷题记录
删除链表的中间节点
就是用到快慢指针,慢走一步快走两步的方法,难点就在于从哪里开始走和在哪里停下来,第一次提交出错问题在于最后的return head;,如果被删除的节点正好是head,那么返回head就出错了,所以改为return preHead->next;
代码
/**
* 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* deleteMiddle(ListNode* head) {
//快慢指针,走两步走一步
ListNode preNode(0,head);
ListNode *preHead = &preNode;
ListNode ppNode(0,preHead);
ListNode *ppHead = &ppNode;
ListNode *p1 = preHead, *p2 = head, *pp = ppHead;
while(1) {
p1 = p1->next;
pp = pp->next;
if(p2 == nullptr) {
break;
}
p2 = p2->next;
if(p2 == nullptr) {
break;
}
p2 = p2->next;
}
pp->next = p1->next;
return preHead->next;
}
};
奇偶链表
代码
/**
* 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) {
//1->next = 1->next->next;
//2->next = 2->next->next;
if(head == nullptr) {
return head;
}
ListNode* p1 = head, *p2 = head->next;
ListNode* t2 = head->next;
while(p1 && p2) {
if(p1->next) {
p1->next = p1->next->next;
}
if(p2->next) {
p2->next = p2->next->next;
}
if(p1->next) {
p1 = p1->next;
}
else {
break;
}
p2 = p2->next;
}
p1->next = t2;
return head;
}
};

浙公网安备 33010602011771号