代码随想录算法训练营第四天 | 两两交换链表中的节点、删除链表的倒数第N个节点、链表相交、环形链表II

题目链接:. - 力扣(LeetCode)

两两交换链表中的节点这道题要求是两两交换节点,这里强调的不是交换数值而是指向,通过代码随想录的视频和文章可以清楚,做链表类题目的思想之一是虚拟头节点,在这道题中还要考虑的是保留1号和3 号(以这两个举例)节点的初始信息,否则后续无法正常传递。在跑自己的代码的时候有两处错误,其中值得在意的是以下问题,如图:

这里我第一次写写做了“cur.next = cur.next.next”,由此我收获了一点相仿,在链表题目中,要明确好节点本身和节点指向两个概念,代码前几行,如:

我理解时中间有一时不太明白图中第3句为什么不是tmp1 = tmp2,加上".next"结合原本定义不是重复了吗?后来理解到".next"的存在带有明显的指向含义,因此这几句代码与其说是赋值,不如说这是传递,因此写代码可以从左往右理解,而不是从右往左的给前面赋值的思想。

题目链接:. - 力扣(LeetCode)

删除链表的倒数第N个节点 这道题目代码随想录采用了一种非常巧妙的方法解决倒数第n个的位置的问题,即用双指针的思路,让快指针和慢指针以相差n部的距离再同时向后移动(实际操作链表需要在删除节点前一个节点操作,因此是n+1),在我看完思路后做题时第一想到的是快指针怎么提前先移动n步,看了看参考代码,直接用for循环,没想到很简单,代码如下:

题目链接:. - 力扣(LeetCode)

链表相交这道题和上一题类似,也是用双指针的方法来找,这里的区别是先找到两个链表的长度并求差,这个题是我第一次完完全全区分链表和数组的题目,具体代码如下:

这个题目我一开始出现了一个错误导致运行失败,是我在求链表长度的时候故意用headA、headB代替cur,我想试试这样写的区别,结果就是在最后求差后调整两个链表的起始点时“curA = curA.next”干脆不识别了。

题目链接:. - 力扣(LeetCode)

这道题也是利用快慢指针,但设计非常巧妙,让快指针只快一个单位长度,利用公式化简就可以得出答案,这里写出了两种写法,核心思路是一样的。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值