Python判斷回文鏈表的方法
什么是回文數(shù)?
回文數(shù)簡(jiǎn)單的說就是正著倒著讀都是一樣的,比如:12321,1221,1111等等,正著讀也是12321,倒著讀也是12321。
首先,接收用戶輸入數(shù)字列表轉(zhuǎn)換成鏈表
比如用戶輸入:1 2 3 2 1,轉(zhuǎn)換為鏈表后,如下圖

首先接收用戶輸入數(shù)字列表,每個(gè)數(shù)字用空格分隔,使用split截?cái)嘧址褂胢ap,把每個(gè)元素映射成int類型,然后再轉(zhuǎn)成list,使用循環(huán)取出每項(xiàng)元素添加到鏈表中。
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é)點(diǎn)為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時(shí),說明鏈表結(jié)束了,也就是代碼中的fast.next.next=None時(shí),鏈表結(jié)束,此時(shí)慢指針剛好指著鏈表的中間位置,所以就得到3是中間位置,從3的下一個(gè)位置。再將中間位置的下一個(gè)節(jié)點(diǎn)開始的鏈表,進(jìn)行倒敘,也就是21,倒敘后為12。

再與中間位置前面一段鏈表進(jìn)行比較是否相等,如果p==None時(shí)說明鏈表為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é)點(diǎn),一快一慢指針,快的是慢的2倍,當(dāng)快指針為None時(shí),說明已經(jīng)找到中間節(jié)點(diǎn)了
while fast.next is not None and fast.next.next is not None:
slow = slow.next # 慢指針每次向后移一個(gè)位置
fast = fast.next.next # 快指針每次向后移2個(gè)位置
h = slow.next
q = reverse(h) # 逆至無頭節(jié)點(diǎn)鏈表
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倒敘鏈表(頭插法):聲明一個(gè)頭節(jié)點(diǎn),然后遍歷每個(gè)節(jié)點(diǎn),再頭插到鏈表里面,總共是4步;
第1步:保存當(dāng)前頭節(jié)點(diǎn)所只向的節(jié)點(diǎn)
第2步:使當(dāng)前節(jié)點(diǎn)指向頭節(jié)點(diǎn)所指向的節(jié)點(diǎn)
第3步:使頭節(jié)點(diǎn)只向當(dāng)前節(jié)點(diǎn)
第4步:使指針(p)指向下一個(gè)節(jié)點(diǎn),指向下一次循環(huán)
頭插法圖解:

完整代碼:
# 逆置不帶頭結(jié)點(diǎn)的單鏈表
def reverse(head):
h = ListNode(0)
p = head
while p is not None:
x = p.next # 保存著當(dāng)前節(jié)點(diǎn)指向的下一個(gè)節(jié)點(diǎn)
p.next = h.next # 當(dāng)前項(xiàng)的指向節(jié)點(diǎn)指向頭節(jié)點(diǎn)指向的節(jié)點(diǎn)
h.next = p # 頭節(jié)點(diǎn)再指向當(dāng)前節(jié)點(diǎn)
p = x # 使節(jié)點(diǎn)指向下一個(gè)節(jié)點(diǎn)
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é)點(diǎn)為0的鏈表
p = l
for i in range(len(lt)):
p.next = ListNode(lt[i])
p = p.next
return l.next
# 逆置不帶頭結(jié)點(diǎn)的單鏈表
def reverse(head):
h = ListNode(0)
p = head
while p is not None:
x = p.next # 保存著當(dāng)前節(jié)點(diǎn)指向的下一個(gè)節(jié)點(diǎn)
p.next = h.next # 當(dāng)前項(xiàng)的指向節(jié)點(diǎn)指向頭節(jié)點(diǎn)指向的節(jié)點(diǎn)
h.next = p # 頭節(jié)點(diǎn)再指向當(dāng)前節(jié)點(diǎn)
p = x # 使節(jié)點(diǎn)指向下一個(gè)節(jié)點(diǎn)
return h.next
# 是否是回文
def palindrome(l):
if l is None:
return True
slow = fast = l
# 查找中間節(jié)點(diǎn),一快一慢指針,快的是慢的2倍,當(dāng)快指針為None時(shí),說明已經(jīng)找到中間節(jié)點(diǎn)了
while fast.next is not None and fast.next.next is not None:
slow = slow.next # 慢指針每次向后移一個(gè)位置
fast = fast.next.next # 快指針每次向后移2個(gè)位置
h = slow.next
q = reverse(h) # 逆至無頭節(jié)點(diǎn)鏈表
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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python OpenCV學(xué)習(xí)之特征點(diǎn)檢測(cè)與匹配詳解
提取圖像的特征點(diǎn)是圖像領(lǐng)域中的關(guān)鍵任務(wù),不管在傳統(tǒng)還是在深度學(xué)習(xí)的領(lǐng)域中,特征代表著圖像的信息,對(duì)于分類、檢測(cè)任務(wù)都是至關(guān)重要的。這篇文章主要為大家詳細(xì)介紹了OpenCV特征點(diǎn)檢測(cè)與匹配,需要的可以參考一下2022-01-01
Python字符和字符值(ASCII或Unicode碼值)轉(zhuǎn)換方法
這篇文章主要介紹了Python字符和字符值(ASCII或Unicode碼值)轉(zhuǎn)換方法,即把字符串在ASCII值或者Unicode值之間相與轉(zhuǎn)換的方法,需要的朋友可以參考下2015-05-05
python面向?qū)ο骭詳談?lì)惖睦^承與方法的重載
下面小編就為大家?guī)硪黄猵ython面向?qū)ο骭詳談?lì)惖睦^承與方法的重載。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-06-06
Python創(chuàng)建多線程的兩種常用方法總結(jié)
這篇文章主要為大家詳細(xì)介紹了Python中創(chuàng)建多線程的兩種常用方法,文中的示例代碼簡(jiǎn)潔易懂,對(duì)我們掌握Python有一定的幫助,需要的可以收藏一下2023-05-05

