删除链表的中间节点
就是用到快慢指针,慢走一步快走两步的方法,难点就在于从哪里开始走和在哪里停下来,第一次提交出错问题在于最后的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; |
| } |
| }; |
奇偶链表
代码
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| class Solution { |
| public: |
| ListNode* oddEvenList(ListNode* head) { |
| |
| |
| 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; |
| } |
| }; |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】