欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python判斷回文鏈表的方法

 更新時間:2022年01月17日 14:44:46   作者:小星博博  
這篇文章主要介紹了Python判斷回文鏈表,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下

什么是回文數(shù)?

回文數(shù)簡單的說就是正著倒著讀都是一樣的,比如:12321,1221,1111等等,正著讀也是12321,倒著讀也是12321。

首先,接收用戶輸入數(shù)字列表轉(zhuǎn)換成鏈表

比如用戶輸入:1 2 3 2 1,轉(zhuǎn)換為鏈表后,如下圖

首先接收用戶輸入數(shù)字列表,每個數(shù)字用空格分隔,使用split截斷字符串,使用map,把每個元素映射成int類型,然后再轉(zhuǎn)成list,使用循環(huán)取出每項元素添加到鏈表中。

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

代碼如下:

# 鏈表類
class ListNode:
    def __init__(self, x):
        self.val = x
        self.next = None
 
# 字符串轉(zhuǎn)換為鏈表
def list_node(s):
    lt = list(map(int, s.split(' ')))
    l = ListNode(0)  # 創(chuàng)建頭節(jié)點為0的鏈表
    p = l
    for i in range(len(lt)):
        p.next = ListNode(lt[i])
        p = p.next
    return l.next

判斷是否是回文

找中間位置處使用快慢指針法,慢指針一次跳一格,快指針一次跳2格,所以快指針是慢指針的2倍,當(dāng)快指針為None時,說明鏈表結(jié)束了,也就是代碼中的fast.next.next=None時,鏈表結(jié)束,此時慢指針剛好指著鏈表的中間位置,所以就得到3是中間位置,從3的下一個位置。再將中間位置的下一個節(jié)點開始的鏈表,進(jìn)行倒敘,也就是21,倒敘后為12。

 再與中間位置前面一段鏈表進(jìn)行比較是否相等,如果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
    # 查找中間節(jié)點,一快一慢指針,快的是慢的2倍,當(dāng)快指針為None時,說明已經(jīng)找到中間節(jié)點了
    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)  # 逆至無頭節(jié)點鏈表
    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

倒敘鏈表(頭插法):聲明一個頭節(jié)點,然后遍歷每個節(jié)點,再頭插到鏈表里面,總共是4步;

第1步:保存當(dāng)前頭節(jié)點所只向的節(jié)點

第2步:使當(dāng)前節(jié)點指向頭節(jié)點所指向的節(jié)點

第3步:使頭節(jié)點只向當(dāng)前節(jié)點

第4步:使指針(p)指向下一個節(jié)點,指向下一次循環(huán)

頭插法圖解:

完整代碼:

# 逆置不帶頭結(jié)點的單鏈表
def reverse(head):
    h = ListNode(0)
    p = head
    while p is not None:
        x = p.next  # 保存著當(dāng)前節(jié)點指向的下一個節(jié)點
        p.next = h.next  # 當(dāng)前項的指向節(jié)點指向頭節(jié)點指向的節(jié)點
        h.next = p  # 頭節(jié)點再指向當(dāng)前節(jié)點
        p = x  # 使節(jié)點指向下一個節(jié)點
    return h.next

完整代碼

# 回文鏈表,輸入1->2輸出false,輸入1->
# 鏈表類
class ListNode:
    def __init__(self, x):
        self.val = x
        self.next = None
 
# 字符串轉(zhuǎn)換為鏈表
def list_node(s):
    lt = list(map(int, s.split(' ')))
    l = ListNode(0)  # 創(chuàng)建頭節(jié)點為0的鏈表
    p = l
    for i in range(len(lt)):
        p.next = ListNode(lt[i])
        p = p.next
    return l.next

# 逆置不帶頭結(jié)點的單鏈表
def reverse(head):
    h = ListNode(0)
    p = head
    while p is not None:
        x = p.next  # 保存著當(dāng)前節(jié)點指向的下一個節(jié)點
        p.next = h.next  # 當(dāng)前項的指向節(jié)點指向頭節(jié)點指向的節(jié)點
        h.next = p  # 頭節(jié)點再指向當(dāng)前節(jié)點
        p = x  # 使節(jié)點指向下一個節(jié)點
    return h.next

# 是否是回文
def palindrome(l):
    if l is None:
        return True
    slow = fast = l
    # 查找中間節(jié)點,一快一慢指針,快的是慢的2倍,當(dāng)快指針為None時,說明已經(jīng)找到中間節(jié)點了
    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)  # 逆至無頭節(jié)點鏈表
    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))

運(yùn)行結(jié)果圖:

到此這篇關(guān)于Python判斷回文鏈表的文章就介紹到這了,更多相關(guān)Python回文鏈表內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python OpenCV學(xué)習(xí)之特征點檢測與匹配詳解

    Python OpenCV學(xué)習(xí)之特征點檢測與匹配詳解

    提取圖像的特征點是圖像領(lǐng)域中的關(guān)鍵任務(wù),不管在傳統(tǒng)還是在深度學(xué)習(xí)的領(lǐng)域中,特征代表著圖像的信息,對于分類、檢測任務(wù)都是至關(guān)重要的。這篇文章主要為大家詳細(xì)介紹了OpenCV特征點檢測與匹配,需要的可以參考一下
    2022-01-01
  • Python搭建Gitee圖床的示例代碼

    Python搭建Gitee圖床的示例代碼

    在寫博客的過程中經(jīng)常要插入圖片,本文將使用Python實現(xiàn)對上傳的圖片自動壓縮,自動編碼,以及自動推送到遠(yuǎn)程倉庫,感興趣的可以了解一下
    2021-10-10
  • Python中str.join()簡單用法示例

    Python中str.join()簡單用法示例

    這篇文章主要介紹了Python中str.join()簡單用法,結(jié)合實例形式分析了Python中str.join()用于連接生成新字符串的相關(guān)操作技巧,需要的朋友可以參考下
    2018-03-03
  • Django添加KindEditor富文本編輯器的使用

    Django添加KindEditor富文本編輯器的使用

    今天小編就為大家分享一篇關(guān)于Django添加KindEditor富文本編輯器的使用,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-10-10
  • Python獲取時間戳的多種方法總結(jié)

    Python獲取時間戳的多種方法總結(jié)

    時間戳是一個表示日期和時間的數(shù)值,通常以秒為單位,在Python中,獲取時間戳是常見的任務(wù),用于記錄事件、計時操作、以及在各種應(yīng)用中跟蹤時間,本文將介紹多種獲取時間戳的方法,包括標(biāo)準(zhǔn)庫和第三方庫的方式,并提供示例代碼以幫助你更好地理解
    2023-11-11
  • Python字符和字符值(ASCII或Unicode碼值)轉(zhuǎn)換方法

    Python字符和字符值(ASCII或Unicode碼值)轉(zhuǎn)換方法

    這篇文章主要介紹了Python字符和字符值(ASCII或Unicode碼值)轉(zhuǎn)換方法,即把字符串在ASCII值或者Unicode值之間相與轉(zhuǎn)換的方法,需要的朋友可以參考下
    2015-05-05
  • python面向?qū)ο骭詳談類的繼承與方法的重載

    python面向?qū)ο骭詳談類的繼承與方法的重載

    下面小編就為大家?guī)硪黄猵ython面向?qū)ο骭詳談類的繼承與方法的重載。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-06-06
  • Python可視化神器pyecharts繪制柱狀圖

    Python可視化神器pyecharts繪制柱狀圖

    這篇文章主要介紹了Python可視化神器pyecharts繪制柱狀圖,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,需要的朋友可以參考一下
    2022-07-07
  • 基于梯度爆炸的解決方法:clip gradient

    基于梯度爆炸的解決方法:clip gradient

    今天小編就為大家分享一篇基于梯度爆炸的解決方法:clip gradient,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-02-02
  • Python創(chuàng)建多線程的兩種常用方法總結(jié)

    Python創(chuàng)建多線程的兩種常用方法總結(jié)

    這篇文章主要為大家詳細(xì)介紹了Python中創(chuàng)建多線程的兩種常用方法,文中的示例代碼簡潔易懂,對我們掌握Python有一定的幫助,需要的可以收藏一下
    2023-05-05

最新評論