当前位置: 首页 > news >正文

三板斧解决leetcode的链表题

在《波奇学单链表》中我们提到单链表的两个特点

  1. 单向性。

  1. 头节点尾节点的特殊性导致分类讨论的情况。

如何看单链表?

让我们简化成下图

cur表示当前节点,下图表示cur移动,圆圈表示值

用哨兵卫节点(新的头节点)和把尾节点看成NULL来把头尾节点一般化。

struct ListNode*guard_h=(struct ListNode*)malloc(sizeof(struct ListNode));
struct ListNode*cur=guard_h;//作为移动节点

相当于有了头节点的前驱节点,可以cur->next=cur->next->next;循环

删除尾节点不用cur->next=NULL(cur是4的地址)直接cur->next=cur->next->next;

简化代码,但要注意释放开辟的空间,避免内存泄露。

快慢指针

创建两个指针一快一慢。

快慢指针找链表的中间节点:leetcode 876.链表中间节点

struct ListNode*fast=head,*slow=head;
int count=0;
while(fast)
{fast=fast->next;count++;if(count%2==0){slow=slow->next;}
}
return slow;//结束时fast为空,slow为中间节点的右边节点

变式:求中间节点的左节点(如1-2-3-4求2)

fast走的节点数=总节点数,fast和slow指针走的节点数如图。

struct ListNode*fast=head,*slow=head;
int count=0;
while(fast)
{fast=fast->next;count++;if(count%2==1&&count>=3){slow=slow->next;}
}
return slow;//结束时fast为空,slow为中间节点的左边节点

反转链表

leetcode:反转单链表

struct ListNode* reverseList(struct ListNode* head) {struct ListNode* newhead = NULL;struct ListNode* cur = head;while(cur){//next指针指向cur的下个节点struct ListNode* next = cur->next;cur->next = newhead;newhead = cur;cur = next;}

合并有序链表

leetcode:合并有序链表

思路:不要试图在原链表中进行插入操作,再开一个新的头节点,把原来链表的值拿过来链接。

用哨兵节点可以简化代码,短的拼完后,再把剩下的链接在一起就行。


struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2){struct ListNode*cur=(struct ListNode*)malloc(sizeof(struct ListNode));cur->next=NULL;cur->val=0;struct ListNode*head=cur;while(list1&&list2){if(list1->val>list2->val){head->next=list2;list2=list2->next;}else{head->next=list1;list1=list1->next;}head=head->next;}struct ListNode*list3=(list1!=NULL?list1:list2);while(list3){head->next=list3;list3=list3->next;head=head->next;}return cur->next;
}

合并链表,快慢指针,以及链表逆序这三板斧掌握了就可以解决leetcode上大部分的链表题。

示例:链表排序

思路:快慢指针找中间节点,再用中间节点不断分割,分割到只有一个节点或空链表。

一节点链表进行合并有序链表,最后把新链表再进行合并有序直到所有链表都合并完成。

总而言之,最基础就是这三个。

http://www.lryc.cn/news/36751.html

相关文章:

  • 全生命周期的云原生安全框架
  • 【本地网站上线】ubuntu搭建web站点,并内网穿透发布公网访问
  • 电脑怎么重装系统?教你轻松掌握这些方法
  • leetcode-每日一题-2379(简单,字符串)
  • SLF4J日志框架在项目中使用
  • Spark MLlib 模型训练
  • Python中变量的作用域精讲
  • 数据仓库工程师的工作职责的相关介绍
  • ESP UART 介绍
  • 第十三届蓝桥杯省赛Python大学B组复盘
  • linux入门---vim的配置
  • Python简写操作(for、if简写、匿名函数)
  • 毕业设计常用模块之温湿度模块DHT11模块使用
  • Cadence Allegro 导出Design Rules Net Shorts Check(DRC)Report报告详解
  • 第 46 届世界技能大赛浙江省选拔赛“网络安全“项目C模块任务书
  • C++:详解C++11 线程(一):MingGW 各版本区别及安装说明
  • 第十二章 ArrayList和 LinkedList的区别
  • 案例06-复用思想的接口和SQL
  • 【Java学习笔记】17.Java 日期时间(2)
  • 【学习Docker(八)】Docker Canal的安装与卸载
  • python的django框架从入门到熟练【保姆式教学】第三篇
  • Open3D(C++) Ransac拟合球体(详细过程版)
  • Antlr Tool与antlr runtime的版本一致性问题
  • 嵌入式中CAN测试自动化方法分析
  • 基于c++、opencv、cuda、Visual Studio编程
  • MATLAB——DFT(离散傅里叶变换)
  • 高端Zynq ultrascale+使用GTH回环测试 提供2套工程源码和技术支持
  • 入门(Createing a scene)
  • Unity入门精要03---透明效果
  • 一文解码:如何在人工智能热潮下实现产业“智”变