Python判断回文链表的方法

 更新时间:2022年01月17日 14:44:46   作者:小星博博  
这篇文章主要介绍了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回文链表内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python __slots__的使用方法

    Python __slots__的使用方法

    这篇文章主要介绍了Python __slots__的使用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • 解决pyinstaller打包pyqt5的问题

    解决pyinstaller打包pyqt5的问题

    今天小编就为大家分享一篇解决pyinstaller打包pyqt5的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-01-01
  • Python ollama的搭建与使用流程分析

    Python ollama的搭建与使用流程分析

    这篇文章主要介绍了Python ollama的搭建与使用流程分析,详细介绍了ollama的安装方式,本文结合实例给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧
    2024-04-04
  • 详解Python读取yaml文件多层菜单

    详解Python读取yaml文件多层菜单

    这篇文章主要介绍了Python读取yaml文件多层菜单,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-03-03
  • Gradio构建交互式Python应用使用示例详解

    Gradio构建交互式Python应用使用示例详解

    这篇文章主要为大家介绍了Gradio构建交互式Python应用使用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12
  • python连接远程ftp服务器并列出目录下文件的方法

    python连接远程ftp服务器并列出目录下文件的方法

    这篇文章主要介绍了python连接远程ftp服务器并列出目录下文件的方法,实例分析了Python使用pysftp模块的技巧,非常具有实用价值,需要的朋友可以参考下
    2015-04-04
  • python自动化实现登录获取图片验证码功能

    python自动化实现登录获取图片验证码功能

    这篇文章主要介绍了python自动化实现登录获取图片验证码功能,本文通过实例截图的形式给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-11-11
  • Python如何用str.format()批量生成网址(豆瓣读书为例)

    Python如何用str.format()批量生成网址(豆瓣读书为例)

    这篇文章主要介绍了Python如何用str.format()批量生成网址(豆瓣读书为例),文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • Python2与Python3的区别实例分析

    Python2与Python3的区别实例分析

    这篇文章主要介绍了Python2与Python3的区别,结合实例形式分析了Python2与Python3在输出、编码、函数、运算等操作的常见区别与使用技巧,需要的朋友可以参考下
    2019-04-04
  • 用python爬取分析淘宝商品信息详解技术篇

    用python爬取分析淘宝商品信息详解技术篇

    这篇文章主要介绍了用python爬取分析淘宝商品信息的技术,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-08-08

最新评论