给你一个单链表的头节点 head
,请你判断该链表是否为回文链表
如果是,返回 true
;否则,返回 false
。
示例 1:
输入:head = [1,2,2,1] 输出:true
示例 2:
输入:head = [1,2] 输出:false
算法逻辑
回文链表的特点为从表头开始向表尾遍历所得到的元素是相同与从表尾开始向表头遍历所得到的元素,举个简单的例子来讲:
arr = [1,2,3,2,1]为一个数组,此数组中arr[0] == arr[4]即第一个元素与第len(arr)个元素是相同的,随后继续看arr[1]与arr[3]发现arr[1] == arr[3]那么这个数组就可以理解为“回文数组”
上述以数组举的例子是为了方便大家理解,当然这也是回文链表的特点,若要证明一个链表为回文链表,我们只需分别从表头表尾开始遍历链表直至链表的中心元素即可。
此方法时间复杂度为O(n)。
代码实现
第一步
我们先自定义一个链表,使其具有插入,输出全部元素,返回链表长度以及返回链表中的元素等功能
insert():链表中加入元素
def insert(self,data):
new_node = Node(data)
if self.head == None:
self.head = new_node
else:
current = self.head
while current.next:
current = current.next
current.next = new_node
display():输出链表中的元素
def display(self):
if self.head == None:
return
else:
current = self.head
while current.next:
print(current.data,end = "->")
current = current.next
print(current.data)
len():返回链表长度
def len(self):
count = 0
if self.head == None:
return count
else:
current = self.head
while current.next:
count = count + 1
current = current.next
return count + 1
output():返回指定位置中元素的值
def output(self,num):
if self.head == None:
return
else:
count = 0
current = self.head
while count < num:
current = current.next
count += 1
return current.data
第二步
同时从表头表尾开始遍历链表,若存在头指针和尾指针指向的元素不相同的情况是返回False,否则返回True
def check(input_list):
for i in range(input_list.len() // 2):
if input_list.output(i) != input_list.output(input_list.len() - i - 1):
return False
break
return True
完整代码
class Node:
def __init__(self,data):
self.data = data
self.next = None
class linked_list:
def __init__(self):
self.head = None
def insert(self,data):
new_node = Node(data)
if self.head == None:
self.head = new_node
else:
current = self.head
while current.next:
current = current.next
current.next = new_node
def display(self):
if self.head == None:
return
else:
current = self.head
while current.next:
print(current.data,end = "->")
current = current.next
print(current.data)
def len(self):
count = 0
if self.head == None:
return count
else:
current = self.head
while current.next:
count = count + 1
current = current.next
return count + 1
def output(self,num):
if self.head == None:
return
else:
count = 0
current = self.head
while count < num:
current = current.next
count += 1
return current.data
def check(input_list):
for i in range(input_list.len() // 2):
if input_list.output(i) != input_list.output(input_list.len() - i - 1):
return False
break
return True
list = linked_list()
list.insert(1)
list.insert(2)
list.insert(2)
list.insert(1)
list.insert(1)
list.display()
print(check(list))