zoukankan      html  css  js  c++  java
  • 152-234. 回文链表

    如何判断一个链表是回文链表。(第一个我写的,下面我根据其他人改编的)
    # Definition for singly-linked list.
    class ListNode(object):
        def __init__(self, val=0, next=None):
            self.val = val
            self.next = next
    
    
    class Solution(object):
        def isPalindrome1(self, head):
            """
            :type head: ListNode
            :rtype: bool
            """
            if not head:
                return True
    
            temp_list = []
    
            temp = head
            temp_list.append(temp.val)
    
            while temp.next:
                temp = temp.next
                temp_list.append(temp.val)
    
            return temp_list == temp_list[::-1]
    
        def isPalindrome2(self, head):
            """
            :type head: ListNode
            :rtype: bool
            """
            if head is None:
                return True
    
            # 这一部分代码很经典,通过fast和slow之间的差值计算出了什么地方时中点
            fast = head
            slow = head
            while fast.next and fast.next.next:
                fast = fast.next.next
                slow = slow.next
    
            # 这一个部分代码是链表反转
            cur = slow.next
            slow.next = None
            pre = None
            while cur:
                temp = cur.next
                cur.next = pre
                pre = cur
                cur = temp
    
            # 这一部分才是最后的比较部分
            while pre:
                if pre.val != head.val:
                    return False
                pre = pre.next
                head = head.next
            return True
    
        def isPalindrome(self, head):
            """这是个神奇的东西,我没明白
            :type head: ListNode
            :rtype: bool
            """
            s1 = 0
            s2 = 0
            t = 1
    
            while head:
                s1 = s1 * 10 + head.val
                s2 = s2 + t * head.val
                t = t * 10
                head = head.next
    
            return s1 == s2
    
    
    if __name__ == '__main__':
        s1 = Solution()
    
        root = ListNode(1)
    
        n1 = ListNode(2)
        n2 = ListNode(2)
        n3 = ListNode(1)
    
        n2.next = n3
        n1.next = n2
        root.next = n1
    
        print(s1.isPalindrome(root))
    
    
  • 相关阅读:
    转--Android中调用webservice的工具类
    转--Android实现ListView过滤功能,继承于BaseAdapter,非ArrayAdapter。
    Kubernetes 1.5 配置dns
    Kubernetes 1.5安装
    HAproxy健康检查的三种方式
    某电商网站线上drbd+heartbeat+nfs配置
    sonarqube代码检测
    Sersync实时同步
    RabbitMQ配置文件
    SVNManager配置
  • 原文地址:https://www.cnblogs.com/liuzhanghao/p/14306699.html
Copyright © 2011-2022 走看看