Python判断回文链表的方法

什么是回文数?

回文数简单的说就是正着倒着读都是一样的,比如:12321,1221,1111等等,正着读也是12321,倒着读也是12321。

首先,接收用户输入数字列表转换成链表

比如用户输入:1 2 3 2 1,转换为链表后,如下图

首先接收用户输入数字列表,每个数字用空格分隔,使用split截断字符串,使用map,把每个元素映射成int类型,然后再转成list,使用循环取出每项元素添加到链表中。

lt = list(map(int, s.split(' ')))

代码如下:

# 链表类
class ListNode:
    def __init__(self, x):
        self.val = x
        self.next = None

# 字符串转换为链表
def list_node(s):
    lt = list(map(int, s.split(' ')))
    l = ListNode(0)  # 创建头节点为0的链表
    p = l
    for i in range(len(lt)):
        p.next = ListNode(lt[i])
        p = p.next
    return l.next

判断是否是回文

找中间位置处使用快慢指针法,慢指针一次跳一格,快指针一次跳2格,所以快指针是慢指针的2倍,当快指针为None时,说明链表结束了,也就是代码中的fast.next.next=None时,链表结束,此时慢指针刚好指着链表的中间位置,所以就得到3是中间位置,从3的下一个位置。再将中间位置的下一个节点开始的链表,进行倒叙,也就是21,倒叙后为12。

再与中间位置前面一段链表进行比较是否相等,如果p==None时说明链表为None,直接返回True,p==None,q也一定为None(具体看后面的倒叙方法)

while p is not None and q is not None:
        if p.val is not q.val:
            return False
        q, p = q.next, p.next

完整代码:

# 是否是回文
def palindrome(l):
    if l is None:
        return True
    slow = fast = l
    # 查找中间节点,一快一慢指针,快的是慢的2倍,当快指针为None时,说明已经找到中间节点了
    while fast.next is not None and fast.next.next is not None:
        slow = slow.next  # 慢指针每次向后移一个位置
        fast = fast.next.next  # 快指针每次向后移2个位置

    h = slow.next
    q = reverse(h)  # 逆至无头节点链表
    slow.next = None
    p = l
    while p is not None and q is not None:
        if p.val is not q.val:
            return False
        q, p = q.next, p.next
    if q is None:
        return True
    else:
        return False

倒叙链表(头插法):声明一个头节点,然后遍历每个节点,再头插到链表里面,总共是4步;

第1步:保存当前头节点所只向的节点

第2步:使当前节点指向头节点所指向的节点

第3步:使头节点只向当前节点

第4步:使指针(p)指向下一个节点,指向下一次循环

头插法图解:

完整代码:

# 逆置不带头结点的单链表
def reverse(head):
    h = ListNode(0)
    p = head
    while p is not None:
        x = p.next  # 保存着当前节点指向的下一个节点
        p.next = h.next  # 当前项的指向节点指向头节点指向的节点
        h.next = p  # 头节点再指向当前节点
        p = x  # 使节点指向下一个节点
    return h.next

完整代码

# 回文链表,输入1->2输出false,输入1->
# 链表类
class ListNode:
    def __init__(self, x):
        self.val = x
        self.next = None

# 字符串转换为链表
def list_node(s):
    lt = list(map(int, s.split(' ')))
    l = ListNode(0)  # 创建头节点为0的链表
    p = l
    for i in range(len(lt)):
        p.next = ListNode(lt[i])
        p = p.next
    return l.next

# 逆置不带头结点的单链表
def reverse(head):
    h = ListNode(0)
    p = head
    while p is not None:
        x = p.next  # 保存着当前节点指向的下一个节点
        p.next = h.next  # 当前项的指向节点指向头节点指向的节点
        h.next = p  # 头节点再指向当前节点
        p = x  # 使节点指向下一个节点
    return h.next

# 是否是回文
def palindrome(l):
    if l is None:
        return True
    slow = fast = l
    # 查找中间节点,一快一慢指针,快的是慢的2倍,当快指针为None时,说明已经找到中间节点了
    while fast.next is not None and fast.next.next is not None:
        slow = slow.next  # 慢指针每次向后移一个位置
        fast = fast.next.next  # 快指针每次向后移2个位置

    h = slow.next
    q = reverse(h)  # 逆至无头节点链表
    slow.next = None
    p = l
    while p is not None and q is not None:
        if p.val is not q.val:
            return False
        q, p = q.next, p.next
    if q is None:
        return True
    else:
        return False

if __name__ == '__main__':
    print("回文链表")
    l = list_node(input())
    print(palindrome(l))

运行结果图:

到此这篇关于Python判断回文链表的文章就介绍到这了,更多相关Python回文链表内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Python3实现的判断回文链表算法示例

    本文实例讲述了Python3实现的判断回文链表算法.分享给大家供大家参考,具体如下: 问题: 请判断一个链表是否为回文链表. 方案一:指针法 class Solution: def isPalindrome(self, head): """ 判断一个链表是否是回文的,很自然的想法就是两个指针,一个指针从前往后走,一个指针从后往前走,判断元素值是否相同,这里要分几个步骤来进行求解: 1.找到链表长度的一半,用追赶法,一个指针一次走两步,一个指针一次走一步 2.将后一半数组转置

  • Python判断回文链表的方法

    什么是回文数? 回文数简单的说就是正着倒着读都是一样的,比如:12321,1221,1111等等,正着读也是12321,倒着读也是12321. 首先,接收用户输入数字列表转换成链表 比如用户输入:1 2 3 2 1,转换为链表后,如下图 首先接收用户输入数字列表,每个数字用空格分隔,使用split截断字符串,使用map,把每个元素映射成int类型,然后再转成list,使用循环取出每项元素添加到链表中. lt = list(map(int, s.split(' '))) 代码如下: # 链表类 c

  • Python判断回文数的三种方法实例

    需求: 从控制台输入一个五位数,如果是回文数就打印"是回文数",否则打印"不是回文数",例如:11111 12321 12221 "回文"是指正读反读都能读通的句子,它是古今中外都有的一种修辞方式和文字游戏,如"我为人人,人人为我"等.在数学中也有这样一类数字有这样的特征,成为回文数(palindrome number). 设n是一任意自然数.若将n的各位数字反向排列所得自然数n1与n相等,则称n为一回文数.例如,若n=123

  • Python计算回文数的方法

    本文实例讲述了Python计算回文数的方法.分享给大家供大家参考.具体如下: 这里检查数字是不是回文数,用196算法生成一个数字的回文数 num = 905; def is_Palindrome(num): """ 判断一个数字是不是回文数,这里有些取巧了 :param num: :return: """ """ :param num: :return: """ temp = "

  • PHP判断一个字符串是否是回文字符串的方法

    本文实例讲述了PHP判断一个字符串是否是回文字符串的方法.分享给大家供大家参考.具体实现方法如下: <?php function ishuiwen($str){ $len=strlen($str); $l=1; $k=intval($len/2)+1; for($j=0;$j<$k;$j++){ if (substr($str,$j,1)!=substr($str,$len-$j-1,1)) { $l=0; break; } } if ($l==1) { return 1; } else {

  • 使用python实现回文数的四种方法小结

    回文数就是指整数倒过来和原整数相等. Example 1: Input: 121 Output: true Example 2: Input: -121 Output: false Explanation: From left to right, it reads -121. From right to left, it becomes 121-. Therefore it is not a palindrome. Example 3: Input: 10 Output: false Expla

  • 解决Python中回文数和质数的问题

    一.前言 今天学习视频时课后作业是找出1000以内既是素数又是回文数的数,写代码这个很容易,结果一运行遇到了bug,输出结果跟预期不一样,调试了快30min,再接着一通搜索和回看视频才发现问题所在.所以特地写下来,方便以后查看.问题的关键是判断素数过程中for-else的用法上(具体看后面代码) 二.实现判断素数的功能 质数(Prime number),又称素数,指在大于1的自然数中,除了1和该数自身外,无法被其他自然数整除的数(也可定义为只有1与该数本身两个因数的数).via--Wikiped

  • 带你粗略了解C++回文链表

    目录 请判断一个链表是否为回文链表. 思路 总结 请判断一个链表是否为回文链表. 示例 1: 输入: 1->2 输出: false 示例 2: 输入: 1->2->2->1 输出: true 思路 1.用快慢指针,快指针有两步,慢指针走一步,快指针遇到终止位置时,慢指针就在链表中间位置 2.同时用pre记录慢指针指向节点的前一个节点,用来分割链表 3.将链表分为前后均等两部分,如果链表长度是奇数,那么后半部分多一个节点 4.将后半部分反转 ,得cur2,前半部分为cur1 5.按照

  • 利用Python判断文件的几种方法及其优劣对比

    目录 前言 懒人的try语句 传统的os模块 时尚的pathlib模块 几种方法优劣对比 总结 前言 我们知道当文件不存在的时候,open()方法的写模式与追加模式都会新建文件,但是对文件进行判断的场景还有很多,比如,在爬虫下载图片的时候,可能需要判断文件是否存在,以免重复下载:又比如,创建新文件的时候,可能需要判断文件是否存在,存在就先做个备份……所以,学习判断文件是否存在,还是很有必要的. 学习是循序渐进的过程,若能建立知识点间的联系,进行系统性的学习,那将更有助于效果.阅读这篇文章,你将读

  • JavaScript求解最长回文子串的方法分享

    目录 题目描述 题解 解决方案 思路一:暴力法 思路二:最长公共字串 思路三:中心拓展 思路四:Manacher 算法 题目描述 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 示例 1: 输入: "babad" 输出: "bab" 注意: "aba" 也是一个有效答案. 示例 2: 输入: "cbbd" 输出: "bb" 题解 回文:指一个正读和反读都相同的字符串

随机推荐