思路:
通过找到链表的中点,然后从中点开始进行逆序。
同时记录中点的位置,和链表开始的位置同时遍历,如果不一致则返回False
具体步骤:
1、遍历链表一次,记录链表的长度
2、遍历第二次,找到链表的中点,同时记录链表的中间位置要记住前一个节点
3、对链表后半部分进行翻转,这个是有套路的。
4、从链表的开始位置以及链表的中间位置,同时进行遍历,如果碰到不相同的数值,则返回False
链表翻转:
场景1、整个链表翻转
场景2、链表的后半部分翻转
场景3、链表局部位置进行翻转
方式很相似:
步骤0、记录结果链表的新节点:用一个新的节点pre,pre.next指向head
步骤1、取出要翻转的节点:找到当前节点的下一个节点temp
步骤2、断开链表,然后链表拼接:链表的当前节点指向temp.next,相当于链表指针右移
步骤3、判断要翻转的节点所在位置:temp节点应该插入到当前节点前,以及pre节点之后,而且之后每次都要把链表下面某个节点位置,重复上述1,2,3,4步骤,可以确定是pre节点之后的节点
即 temp.next = pre.next
步骤4、temp节点插入合适位置,合成新的链表:即 temp.next = pre.next ,pre.next = temp
pre重新指向temp节点
总结:取出节点,断开链表,链表拼接,判断取出节点的位置,然后断开链表,插入该节点,拼接链表
# -*- coding: utf-8 -*-
"""
@Time : 2022/7/12 12:21
@Author: Breeze
@File : is_pair.py
"""
class ListNode:
def __init__(self, x):
self.val = x
self.next = None
def __str__(self):
return f'ListNode(val:{self.val}, next:{self.next})'
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
#
# @param head ListNode类 the head
# @return bool布尔型
#
class Solution:
def isPail(self, head: ListNode) -> bool:
# write code here
i = 0
tmp = head
pre = ListNode(-1)
pre.next = head
final_list = pre
while tmp is not None:
tmp = tmp.next
i += 1
if i <= 1:
return True
# 找到链表的中点
mid = int(i / 2)
j = 0
while j < i:
if j == mid - 1: # 找到链表的中间节点的前置节点
pre = head
elif j == mid: # 对链表进行后半部分进行翻转
while head is not None and head.next is not None:
next = head.next
head.next = next.next
next.next = pre.next
pre.next = next
break
head = head.next
j += 1
head = final_list.next
mid_head = pre.next
k = 0
while k<mid: # 对链表头节点&中间节点进行遍历
if head.val != mid_head.val:
return False
head = head.next
mid_head = mid_head.next
k += 1
return True
if __name__ == '__main__':
s = Solution()
head = ListNode(1)
# head.next = ListNode(2)
# head.next.next = ListNode(1)
# head.next.next.next = ListNode(1)
res = s.isPail(head)
print(res)