快慢指针之判断回⽂单链表

因为回⽂串是对称的, 所以正着读和倒着读应该是⼀样的, 这⼀特点是解决回⽂串问题的关键.
这道题的关键在于, 单链表⽆法倒着遍历, ⽆法使⽤双指针技巧。 那么最简单的办法就是, 把原始链表反转存⼊⼀条新的链表, 然后⽐较这两条链表是否相同。
1、 先通过「双指针技巧」 中的快慢指针来找到链表的中点:

slow = fast = head
while fast and fast.next:
	slow = slow.next
	fast = fast.next.next
# slow

2、从slow开始反转后面的链表,现在就可以开始比较回文串了:

def reverse(head):
	pre = None
	curr = head
	while curr:
		nex = curr.next
		curr.next = pre
		pre = curr
		curr = nex
	return pre
	
left = head
right = reverse(slow)
while right:
	if left.val != right.val:
		return False
	left = left.next
	right = right.next
return True

总结:
首先,寻找回文串是从中间向两端扩展,判断回文串是从两端向中间收缩。对于单链表,无法直接倒序遍历,可以造一条新的反转链表,可以利用链表的后序遍历,也可以用栈结构倒序处理单链表。
具体到回文链表的判断问题,由于回文的特殊性,可以不完全反转链表,而是仅仅反转部分链表,将空间复杂度降到 O(1)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值