BM13 判断一个链表是否为回文结构

思路:

通过找到链表的中点,然后从中点开始进行逆序。

同时记录中点的位置,和链表开始的位置同时遍历,如果不一致则返回False

具体步骤:

1、遍历链表一次,记录链表的长度

2、遍历第二次,找到链表的中点,同时记录链表的中间位置要记住前一个节点

3、对链表后半部分进行翻转,这个是有套路的。

4、从链表的开始位置以及链表的中间位置,同时进行遍历,如果碰到不相同的数值,则返回False

链表翻转:

场景1、整个链表翻转

场景2、链表的后半部分翻转

场景3、链表局部位置进行翻转

方式很相似:

步骤0、记录结果链表的新节点:用一个新的节点pre,pre.next指向head

步骤1、取出要翻转的节点:找到当前节点的下一个节点temp

步骤2、断开链表,然后链表拼接:链表的当前节点指向temp.next,相当于链表指针右移

步骤3、判断要翻转的节点所在位置:temp节点应该插入到当前节点前,以及pre节点之后,而且之后每次都要把链表下面某个节点位置,重复上述1,2,3,4步骤,可以确定是pre节点之后的节点

即 temp.next = pre.next

步骤4、temp节点插入合适位置,合成新的链表:即 temp.next = pre.next ,pre.next = temp

pre重新指向temp节点

总结:取出节点,断开链表,链表拼接,判断取出节点的位置,然后断开链表,插入该节点,拼接链表

      

# -*- coding: utf-8 -*-
"""

@Time  : 2022/7/12 12:21
@Author: Breeze
@File  : is_pair.py
"""


class ListNode:
    def __init__(self, x):
        self.val = x
        self.next = None

    def __str__(self):
        return f'ListNode(val:{self.val}, next:{self.next})'


# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
#
# @param head ListNode类 the head
# @return bool布尔型
#
class Solution:
    def isPail(self, head: ListNode) -> bool:
        # write code here
        i = 0
        tmp = head
        pre = ListNode(-1)
        pre.next = head
        final_list = pre
        while tmp is not None:
            tmp = tmp.next
            i += 1
        if i <= 1:
            return True

        # 找到链表的中点
        mid = int(i / 2)
        j = 0
        while j < i:
            if j == mid - 1: # 找到链表的中间节点的前置节点
                pre = head
            elif j == mid:  # 对链表进行后半部分进行翻转
                while head is not None and head.next is not None:
                    next = head.next
                    head.next = next.next
                    next.next = pre.next
                    pre.next = next
                break
            head = head.next
            j += 1

        head = final_list.next
        mid_head = pre.next
        k = 0
        while k<mid: # 对链表头节点&中间节点进行遍历
            if head.val != mid_head.val:
                return False
            head = head.next
            mid_head = mid_head.next
            k += 1
        return True


if __name__ == '__main__':
    s = Solution()
    head = ListNode(1)
    # head.next = ListNode(2)
    # head.next.next = ListNode(1)
    # head.next.next.next = ListNode(1)

    res = s.isPail(head)
    print(res)
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mtj66

看心情

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值