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]
思路二:快慢指针 + 反转链表
- 利用快慢指针
slow
和fast
,慢指针在辅助指针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