这篇文章主要介绍了两个重要思想:1、怎样以一次就找到链表的中间节点。2、在空间复杂度为O(1)的情况下反转链表
进阶条件下,判断回文链表
题目链接,主要讲解进阶要求下的方法。
1 |
|
之前做过判断过数字是否为回文数,思路主要是找到中点,然后判断前半部分和后半部分的反转是否相等,或者正序遍历前半部分,逆序遍历后半部分,依次比对。现在在链表不能直接得到长度,所以采用快慢指针的思路找中点。
1 |
|
其中慢指针总是指向头部和快指针的中点,当遍历束时,慢指针刚好指向整个链表的中点,ok,那这里会有朋友问了,一般涉及中点,就要考虑两种情况,长度为偶数或奇数,当然我们这里考虑了,两个if判断就是将奇偶两种长度的链表区分开来,如果是偶数长度,则慢指针再往后移动一步,因为此时直接跳出的话,慢指针是停在中点左面的。如果是奇数长度,则直接跳出,此时慢指针已经指在中点了。
1 |
|
这里我们先介绍一下这个空间复杂度为O(1)的链表反转函数,我主要说一下思路,我刚开始时没想到,是百度之后才明白的。弹出新的头部指向上一次产生的头部,比如:链表为1->2->3,当前弹出1称为新的头部指向上一次的头部(此时储存上一次的头部的节点刚初始化为None),下一次,弹出2为新的头部指向上一次的头部1,此时的链表为两个(原本的链表被断开了):2->1->None和3。
1 |
|
接着我们继续讨论回文判断,此时我们得到了中间节点,直接进行反转,然后以得到的反转链表为基准,进行遍历,只要对应位置的值都相等就返回True。