判斷單鏈表字串是否為回文字串

2021-08-28 21:03:54 字數 2802 閱讀 5835

判斷單鏈表字串是否為回文字串

例如:abcba    上海自來水來自海上

思想:利用快慢指標,快指標一次走兩格,慢指標一次乙個,因為這個字串為單數,當快指標走到尾,慢指標正好走到中間,將這個中值儲存下來,利用乙個函式將後半部分反轉(因為中值已經被記錄,中值.next就是後半部分的head),用乙個比較函式比較,當反轉的字串走完(長度為n/2 - 1),已經比較完成,返回結果。

下面是python3實現:

from typing import optional

class node:

def __init__(self, date: int, next= none):

self.date = date

self._next = next

class singlylinkedlist:

def __init__(self):

self._head = none

def find_by_value(self, value: int) -> optional[node]:

p = self._head

while p and p.date !=value:

p = p._next

return p

def find_by_index(self, index: int) -> optional[node]:

p = self._head

position = 0

while p and position != index:

p = p._next

position += 1

return p

def insert_value_to_head(self, value: int):

new_node = node(value)

self.insert_node_to_head(new_node)

def insert_node_to_head(self, new_node: node):

if new_node:

new_node._next = self._head

self._head = new_node

def insert_value_to_after(self, node: node, value: int):

new_node = node(value)

self.insert_node_to_after(node, new_node)

def insert_node_to_after(self, node: node, new_node: node):

if not node or not new_node:

return

new_node._next = node._next

node._next = new_node

def __repr__(self) -> str:

nums =

current = self._head

while current:

current = current._next

if len(nums) > 0 :

return '->'.join(str(num) for num in nums)

else:

return ''

def reverselist(self, head: node):#反序

#prev表示剛處理過的節點

prev = none

while head:

temp = head._next

head._next = prev

prev = head

head = temp

return prev

def findmiddle(self, head: node):#尋找中值

if not head or not head._next:

return false

#兩個指標

p = head

q = head

while q and q._next:

p = p._next

q = q._next._next

return p

def ispalindrome(self, head: node):#判斷是否為回文字串

if not head or not head._next:

return false

#乙個指標正常遍歷

p = head

#找到中值,方便另乙個指標找頭

middle = self.findmiddle(head)

#另乙個指標遍歷後半部分的反序

q = self.reverselist(middle._next)

while p and q and p.date == q.date:

p = p._next

q = q._next

#遍歷完成,若為回文,q肯定為空,p肯定指向中值

return q == none

if __name__ == '__main__':

l = singlylinkedlist()

l.insert_value_to_head('a')

l.insert_value_to_head('b')

l.insert_value_to_head('c')

l.insert_value_to_head('b')

l.insert_value_to_head('a')

print(l.ispalindrome(l._head))

使用單鏈表來判斷字串是否為回文字串

首先,回文字串是指首位對稱的字串,如abcddcba abcdcba。下面以單鏈表的知識來 展示,如何判斷回文字串的。單鏈表資料結構 public class linknode public void setnext linknode next public string getdata publi...

判斷字串是否為回文串

題目 給定乙個字串,驗證它是否是回文串,只考慮字母和數字字元,可以忽略字母的大小寫。說明 本題中,我們將空字串定義為有效的回文串。示例 1 輸入 a man,a plan,a canal panama 輸出 true 示例 2 輸入 race a car 輸出 false字串轉為小寫字串從字串開始和...

判斷字串是否回文字串

給定乙個字串,驗證它是否是回文串,只考慮字母和數字字元,可以忽略字母的大小寫。說明 本題中,我們將空字串定義為有效的回文串。示例 1 輸入 a man,a plan,a canal panama 輸出 true 示例 2 輸入 race a car 輸出 false public static bo...