什么是回文數?
回文數簡單的說就是正著倒著讀都是一樣的,比如: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))
運行結果圖:

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/397346.html
標籤:其他
