LeetCode 热题 HOT 100 (003/100)【宇宙最简单版】

【链表】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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值