Palindrome Linked List

本文介绍了一种通过双指针法找到链表中点,并反转后半部分链表来判断链表是否为回文的有效算法。该算法适用于单链表,通过比较前后两部分节点值来确定整个链表是否对称。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Given a singly linked list, determine if it is a palindrome.

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    def isPalindrome(self, head: ListNode) -> bool:
        
        if(head==None or head.next==None):
            return True
        slow=head
        fast=head.next
        while(fast and fast.next):
            slow=slow.next
            fast=fast.next.next
       
        prev=slow
        slow=slow.next
        prev.next=None
        pBefore=None
        while(slow):
            pNext=slow.next
            slow.next=pBefore
            pBefore=slow
            slow=pNext
           
        while(head!=None and pBefore!=None):
            if(pBefore.val!=head.val):               
                return False
            pBefore=pBefore.next
            head=head.next
           
        return True

同样使用前后指针法得到中间的点,slow始终指向中点,fast始终是slow的两倍,要将slow作为第一个链表的终点,要它的next置为空,还要注意后面半个链表反转的时候的头是pBefore.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值