题目描述
请编写一个函数,检查链表是否为回文。
给定一个链表ListNode* pHead,请返回一个bool,代表链表是否为回文。
测试样例:
{1,2,3,2,1}
返回:true
{1,2,3,2,3}
返回:false
思路一
存入到list中,再判断逆序后的list是否等于原lit
# -*- coding:utf-8 -*-
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Palindrome:
def isPalindrome(self, pHead):
# 存入到list中,再判断逆序后的list是否等于原lit
node = []
while pHead:
node.append(pHead.val)
pHead = pHead.next
reverse = node[::-1]
return reverse == node
思路二
利用一个快指针,一个慢指针。慢指针每次走一步,快指针每次走两步。把慢指针走过的结点入栈,比较栈中结点跟慢指针剩余未走过的结点。特别注意:链表长度是奇数还是偶数,如果是奇数,慢指针应该跳过中间结点再进行比较
class Palindrome:
def isPalindrome(self, pHead):
'''
利用一个快指针,一个慢指针。慢指针每次走一步,快指针每次走两步。把慢指针走过的结点入栈
比较栈中结点跟慢指针剩余未走过的结点。特别注意:链表长度是奇数还是偶数,如果是奇数,慢
指针应该跳过中间结点再进行比较
'''
fast = pHead
slow = pHead
stack = []
while fast != None and fast.next != None:
stack.append(slow.val)
slow = slow.next
fast = fast.next.next
if fast != None: # 如果是奇数个node,此时slow指的是中间,应该从后一个还是比较
slow = slow.next
while slow:
if slow.val != stack.pop():
return False
slow = slow.next
return True