链表问题的解题思路

链表刷题经历

2022.04.30

  • leetcode206 反转链表
  • 解题思路:利用双指针,对要反转的链表定义一前一后两个指针pre和cur,反复迭代。
  • leetcode92 反转链表Ⅱ
  • 与Ⅰ的区别:反转指定的两个下标之间的链表
  • 解题思路:利用双指针,对要反转的链表定义一前一后两个指针rpe和cur,让两个指针分别指向要反转的部分链表的头节点和尾节点,利用Ⅰ的思路反转中间部分。
  • leetcode160 相交链表
  • 解题思路:利用双指针,一个指针p1从A开始遍历,遍历到null则转而继续从B开始遍历,另一个指针p2从B开始遍历,遍历到null则转而继续从A开始遍历。两者同时开始遍历,如果相交,则交点即为p1=p2时的节点;如果不相交,则最终会抵达p1=p2=null。
  • leetcode143 重排链表
  • 解题思路:① 找出链表中点 ② 对中点之后的链表进行反转 ③ 合并两部分链表
  • leetcode148 排序链表
  • 解题思路:利用归并排序对数组进行排序的思路,递归的对链表进行排序。
  • 注意点:当用双指针slow和fast寻找链表中点时,如果slow和fast起始都指向head,此时判断条件应该为fast.next != null && fast.next.next != null 而不能是fast != null && fast.next != null,否则得到的位置,可能并不是中点。
  • 思考:应该学会不断改变链表结点next的方式进行排序来节约资源,避免新建链表。
  • leetcode21 合并两个有序链表
  • 解题思路:利用双指针,两个指针怕p1和p2分别指向两个链表的头部,通过不断改变链表结点next的方式进行排序。
  • 小技巧:记得利用虚拟头节点dummy来保存起始位置。
  • leetcode141 环形链表
  • 解题思路:利用双指针,两个指针slow和fast同时指向head,如果两个指针存在相遇的情况,则链表存在环。
  • leetcode142 环形链表Ⅱ
  • 与Ⅰ的区别:需要找出入环节点
  • 解题思路:当两节点相遇之后,把任一节点重新放到head,两者同步同速移动,下次相遇的节点就是入环节点
  • leetcode19 删除链表中的倒数第N个节点
  • 解题思路:利用双指针,定义两个指针p1和p2同时指向dummy节点,p1先走N步后,p2也开始走,当p1走到最后一个节点(非null)时,p2即走到倒数第N+1个节点,然后改变p1指向的节点的next即可。
  • 小技巧:虚拟头节点dummy是链表题目的一个利器,如果处理链表时或者在题目的要求中,有可能对链表的头节点产生影响,那么一定要预设虚拟头节点dummy,它可以有效保存头节点,并避免空指针。
  • leetcode83 删除链表中重复元素
  • 解题思路:利用双指针,定义两个指针slow和fast同时指向链表的头节点。如果fast指向的节点内容和slow节点指向的节点内容相同,则slow不做改变,fast指针后移;不同时,slow指向的节点的next改为fast,slow和fast指针同时后移一位。当fast走到null时停止,并将slow指向的节点的next改为null
  • leetcode82 删除链表中重复元素Ⅱ
  • 与Ⅰ的区别:重复元素一个不留
  • 解题思路:利用双指针,定义两个指针slow和fast,slow指向dummy,fast指向head节点,fast指针后移至下一个元素不同的节点之前。如果此时slow指针指向的节点和fast指针指向的节点相邻,则说明该元素不重复,此时slow和fast同时后移一位;如果此时两者不相邻则说明fast指针指向的节点的值重复,需要删除,此时slow指向的节点的next属性需要修改为fast指向节点的下一个节点,同时fast后移一位。
  • 小技巧:由于此时会影响到头节点,记得使用虚拟头节点dummy
  • leetcode234 回文链表
  • 解题思路:利用双指针,定义两个指针slow和fast,找到链表的中间位置,对中间位置之后的链表进行反转,然后遍历前后两个链表,一一比较是否相同,若完全相同,则是回文链表;若存在不同,则不是回文链表。

2022.05.15

  • leetcode146 LRU缓存机制
  • 解题方法:利用哈希表 + 双向链表。
  • 基本思路:哈希表用于存储的key-node,提升查询效率;双向链表节点中存储真实key-value的数据,在存储数据的同时依靠指针维护数据使用的先后顺序。
  • 具体实现:① 在调用put方法时,先去哈希表中搜索该数据是否存在,如果存在,将该数据对应的节点放在双向链表的首位,同时将更新对应节点中的数据信息。如果不存在,将该新建该数据的节点并置于双向链表的首位,同时将key-node数据存入哈希表,此外,还须判断是否当前哈希表容量超出范围,超出则移除双向链表中尾部的节点,及哈希表中的数据,如果未超出范围,则不做改变。 ② 在调用get方法时,去哈希表中搜索该数据是否存在,存在则将该数据对应的节点位置移动到双向链表的头部,同时返回该值。不存在,则直接返回-1。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 建立学生信息链表解题思路如下: 1. 定义学生信息结构体 首先,我们需要定义一个学生信息的结构体,包括学生的姓名、学号、性别、年龄等信息。 2. 定义链表结构体 其次,我们需要定义链表结构体,包括链表节点的指针和学生信息结构体。 3. 创建头节点 接着,我们需要创建头节点,头节点的作用是方便链表的操作,例如插入、删除、查找等。 4. 插入节点 然后,我们可以通过输入学生信息的方式,向链表中插入节点,每个节点包括一个学生信息结构体和一个指向下一个节点的指针。 5. 遍历链表 最后,我们可以通过遍历链表的方式,输出链表中所有节点的学生信息。 总的来说,建立学生信息链表的过程就是创建链表结构体、插入节点和遍历链表的过程。在这个过程中,我们需要注意指针的使用以及内存的分配和释放。 ### 回答2: 建立学生信息链表解题思路如下: 1. 首先,定义一个学生信息的结构体,包括学生的姓名、学号、年龄等信息。 2. 创建一个头节点,作为链表的初始节点。 3. 通过用户输入,逐个添加学生信息节点到链表中。可以采用循环结构,在每次循环中,创建一个新的节点,并让用户输入该节点的学生信息。然后根据链表的结构,将该节点插入到链表的合适位置。可以根据学生的学号或者姓名来决定插入的位置。 4. 当添加完所有学生信息后,可以提供以下功能: - 查找:根据学号或者姓名来查找某个学生的信息。遍历整个链表,找到对应学生节点,并输出相关信息。 - 修改:根据学号或者姓名来定位到某个学生的节点,并允许修改该学生的信息。 - 删除:根据学号或者姓名来定位到某个学生的节点,并删除该节点。 - 遍历:遍历整个链表,输出所有学生的信息。 5. 可以在每个功能的实现中加入一些输入校验的逻辑,确保用户输入的学生信息的有效性,例如学号不能重复。 6. 最后,记得在程序结束时释放链表内存,避免内存泄漏。 以上是建立学生信息链表的基本思路,具体的实现细节可以根据实际需求进行调整和完善。 ### 回答3: 建立学生信息链表可以采用以下步骤: 1. 定义学生信息的数据结构:首先需要定义学生的各种信息,如学号、姓名、年龄、性别等,可以使用一个结构体来存储这些信息。 2. 创建链表结点:每个链表结点包含一个学生信息的数据结构和一个指向下一个结点的指针。 3. 初始化链表:创建一个头结点,将头结点的指针指向NULL,表示链表为空。 4. 添加学生信息:根据用户输入的学生信息,创建一个新的链表结点,并将输入的信息存入结点中。然后将该结点的指针指向原链表的头结点,再将新结点设为头结点,即可完成添加操作。 5. 查找学生信息:遍历链表,逐个比较每个结点中的学生信息,找到与要查找的信息匹配的结点。 6. 修改学生信息:同样需要遍历链表,找到需要修改的结点,然后更新其信息。 7. 删除学生信息:遍历链表,找到需要删除的结点,将其从链表中摘除即可。 8. 输出学生信息:通过循环遍历链表,将每个结点中的学生信息输出到屏幕上。 最后,根据具体需求,可以进一步完善链表功能,如排序、插入、统计等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值