题目:
题解一:
思路:
- 找到链表的中间结点
- 对后半部分的链表进行翻转
- 然后对前半部分和后半部分的值逐一进行比较
在找链表中间结点的时候,不用进行链表奇偶的判断。
原因如下所示:
如图所示,我们设置一个快指针,一个慢指针来查找链表的中间结点。(快慢指针的应用,感觉很巧妙。
快慢指针:设置一个快指针,一个慢指针,可以查找链表的中间结点;
同时一个快指针,一个慢指针,可以判断链表是否是环形链表;
同时对于双指针可以用于三数字之和,四数之和的判断
但是从图中我们可以看出无论链表长度是奇数还是偶数,slow.next(慢指针)始终指向下半部分开始的第一个结点。
为了方便,我们需要设置一个头结点,头结点为指针移动的方便(即在第一次移动指针的时候慢指针指向第一个结点,快指针指向第二个结点)。
我们先利用快慢指针来进行查找中间结点;
然后进行链表反转,对于链表反转,需要设置一个None结点和一个临时变量,来帮助我们反转链表。
反转之后,逐一及进行比较值即可。
代码如下:
class Solution:
def isPalindrome(self, head):
#设置头节点
head1 = ListNode(0)
head1.next = head
#找到链表的中间节点
fast = head1
slow = head1
while(fast is not None and fast.next is not None):
fast = fast.next.next
slow = slow.next
#然后进行反转
# print(slow.val)
second_node = slow.next
# print(second_node.val)
pre = None#创建一个空的节点
while(second_node):
next_node = second_node.next
second_node.next = pre
pre = second_node
second_node = next_node
#下面进行比较
temp = True
# print(head.val)
# print(pre.val)
while(temp and pre is not None):
if head.val != pre.val:
temp = False
return False
head = head.next
pre = pre.next
return True
这样就是有O(n)的时间复杂度,O(1)的空间复杂度。