题目描述: 给定一个链表,判断该链表是否是回文结构。 例如: 1->2->3->2->1 是回文链表。 1->2->3->3->2->1 是回文链表。 输入:待判断的整数链表 输出:若是回文结构则输出1,否则输出0。
时间: 2023-06-10 19:06:32 浏览: 92
可以使用快慢指针和栈来解决这个问题。
具体步骤如下:
1. 定义快指针 fast 和慢指针 slow,初始时都指向链表的头节点。
2. 快指针每次前进两步,慢指针每次前进一步,直到快指针到达链表尾部或者下一个节点为空。
3. 如果快指针到达链表尾部,则链表长度为偶数,否则链表长度为奇数。
4. 将慢指针后面的节点依次入栈。
5. 再次遍历链表,比较链表前半部分和栈中元素是否相同,如果相同则为回文结构,否则不是。
下面是具体的代码实现:
```python
class ListNode:
def __init__(self, x):
self.val = x
self.next = None
def isPalindrome(head: ListNode) -> bool:
if not head or not head.next:
return True
# 快慢指针找到链表的中间节点
fast = slow = head
while fast and fast.next:
fast = fast.next.next
slow = slow.next
# 如果链表长度为奇数,慢指针再往后移一位
if fast:
slow = slow.next
# 将慢指针后面的节点依次入栈
stack = []
while slow:
stack.append(slow.val)
slow = slow.next
# 比较链表前半部分和栈中元素是否相同
while stack:
if head.val != stack.pop():
return False
head = head.next
return True
```
时间复杂度为 O(n),空间复杂度为 O(n)。
阅读全文