leetcode10- 234.请判断一个链表是否为回文链表

                               234.请判断一个链表是否为回文链表

示例 1:

输入: 1->2
输出: false

示例 2:

输入: 1->2->2->1
输出: true

思路一:堆栈

  • 遍历链表,把每个节点都push到数组列表中
  • 构造一个列表的反向副本
  • 判断两者的元素是否相同

代码一:

def isPalindrome(self, head: ListNode) -> bool:
    vals = []
    current_node = head
    while current_node is not None:
        vals.append(current_node.val)
        current_node = current_node.next
    return vals == vals[::-1]

思路二:快慢指针 + 反转链表

  • 利用快慢指针slowfast,慢指针在辅助指针temp的帮助下边走边反转。当快指针走到底时,链表的前半边已经是反转后的了。
  • 反转前半部分链表存在newHead中
  • 对链表进行遍历,判断链表是否相等

代码二:

#  反转链表
class Solution:
    def isPalindrome(self, head):
        if not head or not head.next: 
            return True
        fast = slow = head
        newHead = None
        while fast and fast.next:
            temp = slow
            fast = fast.next.next
            slow = slow.next
            # 反转前半部分链表
            temp.next = newHead
            newHead = temp
        # 根据fast的位置(在最后还是为空)判断链表总节点数的奇偶性
        # 进而决定是否调节slow(使其成为后半段的起点)
        if fast:
            slow = slow.next
        # 遍历两段链表
        p, q = newHead, slow
        # 由上述,两段链表是等长的
        while p:
            if p.val != q.val:
                return False
            p = p.next
            q = q.next
        # 因为等长,所以一旦全部相等就可以判定为回文
        return True

猜你喜欢

转载自blog.csdn.net/qq_43299522/article/details/108939166
今日推荐