【链表】No. 0234 回文链表 【简单】👉力扣对应题目指路
希望对你有帮助呀!!💜💜 如有更好理解的思路,欢迎大家留言补充 ~ 一起加油叭 💦
欢迎关注、订阅专栏 【力扣详解】谢谢你的支持!
⭐ 题目描述:有一个单链表的头节点 head ,请判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false。
- 图示为回文链表:
🔥 思路:反转前半段链表,然后双指针逐个比较
- 【快速思路】链表无法随机访问,只能逐个访问,所以利用列表 (存储前半段) 来判断回文性
- 时间复杂度 O(n) , 空间复杂度 O(n)
- 【优化空间复杂度】不存储前半段链表,而是原地反转前半段
⭐题目准备之链表反转:一定要先掌握链表反转 ❗❗❗ 放在最后面啦,供不熟悉的友友参考~
参考如上思路,给出详细步骤如下:
- 步骤一⭐获取链表长度
L
,一半长度L_half
和 长度为奇数one_more_step
标志- 步骤二⭐反转前半段链表,获取前、后两段链表的头节点
p1
p2
- 只反转前半段,长度为
L_half
,反转结束后的pre
cur
分别为p1
p2
- 步骤三⭐逐个比较两段链表的节点数值,根据题意判断、返回
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def isPalindrome(self, head: Optional[ListNode]) -> bool:
def get_len(head):
current = head
result = 0
while current:
result += 1
current = current.next
return result
def reverse(current_head, L_half): ## 基本同反转链表代码,但是只反转 L_half 长度
pre = None
cur = current_head
cnt = L_half
while cnt: ## 原反转链表为 while cur:
temp = cur.next
cur.next = pre
pre = cur
cur = temp
cnt -= 1
return pre, cur
# ---------------------------------- step 1
L = get_len(head)
L_half = L//2
one_more_step = L%2 == 1
# ---------------------------------- step 2
p1, p2 = reverse(head, L_half)
if one_more_step: p2 = p2.next
# ---------------------------------- step 3
while p1:
if not p1.val == p2.val:
return False
p1 = p1.next
p2 = p2.next
return True
⭐⭐⭐题目准备之链表反转:一定要先掌握链表反转 ❗❗❗
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def reverseList(self, head: Optional[ListNode]) -> Optional[ListNode]:
def reverse(current_head):
pre = None ## 当前节点的上一节点
cur = current_head ## 当前节点
while cur: ## 改连当前节点指向原下一节点:为当前节点指向原上一节点
temp = cur.next ## 当前节点的下一节点
cur.next = pre ## 改连操作
## 准备处理下一处
pre = cur
cur = temp
return pre
return reverse(head)
希望对你有帮助呀!!💜💜 如有更好理解的思路,欢迎大家留言补充 ~ 一起加油叭 💦
🔥 LeetCode 热题 HOT 100