题目:

思路:

  1. 找到中间的节点。因为链表没有len()求长度的函数,所以可以通过遍历链表同时计数求得长度。而一种更巧的方法是用快慢指针,快指针指到末尾,慢指针指到中间。
  2. 反转后半部分的链表,反转链表的具体实现是用双指针,可以看https://blog.csdn.net/m0_74164311/article/details/155111804?spm=1001.2014.3001.5501https://blog.csdn.net/m0_74164311/article/details/155111804?spm=1001.2014.3001.5501

代码:

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def isPalindrome(self, head: Optional[ListNode]) -> bool:
        fast ,slow = head, head
        while fast.next and fast.next.next: #终止条件
            fast = fast.next.next # 快指针走两步
            slow = slow.next #慢指针走一步
        #反转后半部分链表
        pre, curr = None, slow.next
        while curr:
            temp = curr.next
            curr.next = pre
            pre = curr
            curr = temp
        #逐步比较前、后部分
        left, right = head, pre
        while right:
            if left.val != right.val:
                return False
            left = left.next
            right = right.next
        return True

        

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐