LeetCode高频100题刷题记录之——回文链表

1 问题描述

回文链表的含义就是链表内各个结点的值具有对称结构,如 1 → 2 → 4 → 2 → 1 1\rightarrow2\rightarrow4\rightarrow2\rightarrow1 12421这样的,判断一个单向链表是否是回文链表。

2 算法实现

这里只给出题目进阶难度的关于只使用常数量级额外空间以及时间复杂度为 O ( n ) O(n) O(n)的算法:

思路是,首先使用快慢指针找到链表的中间结点,然后把后面一半反转,再遍历前一半与后一半,进行对比。

注意,在对比时,对比的终止条件要以反转链表的指针为准,因为在链表长度为偶数时,前一半链表会比后一半链表多出一个数(即后一半链表的第一个数其实也包含在前一半链表中)

# 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: ListNode) -> bool:
        if head is None:
            return False
        elif head.next is None:
            return True
        else:
            fast = head  # 使用快慢指针找到中间节点
            slow = head
            while (fast is not None and fast.next is not None):
                slow = slow.next
                fast = fast.next.next
            
            head_2 = self.reverse(slow)  # 反转链表
            p1 = head  # 比较前一半与反转的后一半链表之间数据关系
            p2 = head_2
            signal = True
            while (p2 is not None):
                if p1.val != p2.val:
                    signal = False
                    break
                p1 = p1.next
                p2 = p2.next
            
            head_2 = self.reverse(head_2)
            return signal


    def reverse(self, cur: ListNode) -> ListNode:  # 链表反转

            newhead = None
            while cur is not None:
                Next = cur.next
                cur.next = newhead
                newhead = cur
                cur = Next
            return newhead

你可能感兴趣的:(Leetcode刷题记录,leetcode,链表,算法,数据结构,python)