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;
}
};
posted @   三文咸鱼  阅读(8)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示