您的位置:首页 > 编程语言 > Python开发

链表问题---判断一个链表是否为回文结构

2017-11-13 09:45 253 查看
【题目】

  给定一个链表的头节点head,请判断该链表是否为回文结构。

  进阶:如果链表长度为N,要求时间复杂度O(N),空间复杂度O(1)。

【基本思路】

  方法一。时间复杂度O(N),空间复杂度O(N)。

  

  使用栈,遍历一遍链表把每个节点都压入栈中,这样在弹出栈的时候,所有的节点就逆序了。依次对比原链表的每个节点即可。

#python3.5
def isPalindrome1(head):
if head == None or head.next == None:
return True
stack = []
cur = head
while cur != None:
stack.append(cur)
cur = cur.next
while stack:
if stack.pop().val != head.val:
return False
head = head.next
return True


  方法二。时间复杂度O(N),空间复杂度O(N/2)。

  

  也使用栈,但是这次只将链表的后半部分压入栈中,这样在弹出栈的时候,后半部分的节点就逆序了。依次对比链表的前半部分和逆序后的后半部分的每个节点即可。

def isPalindrome2(head):
if head == None or head.next == None:
return True
stack = []
pre = head
cur = head
while cur.next != None and cur.next.next != None:
pre = pre.next
cur = cur.next.next
while pre != None:
stack.append(pre)
pre = pre.next
while stack:
if stack.pop().val != head.val:
return False
head = head.next
return True


  方法三。时间复杂度O(N),空间复杂度O(1)。

  

  首先改变链表右半区的结构,使整个右半区的指针反指,中间节点的next指向None。接下来从两端开始向中间依次对比即可。需要注意的是,再判断完毕后要将链表调整会原链表的结构。

def isPalindrome3(head):
if head == None or head.next == None:
return True
pre = head
cur = head
while cur.next != None and cur.next.next != None:
pre = pre.next
cur = cur.next.next
node = pre.next
pre.next = None
while node != None:
next = node.next
node.next = pre
pre = node
node = next
node = pre
res = True
while pre != None and head != None:
if pre.val != head.val:
res = False
break
pre = pre.next
head = head.next
pre = node.next
node.next = None
while pre != None:
next = pre.next
pre.next = node
node = pre
pre = next
return res
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  链表 python