链表问题---判断一个链表是否为回文结构
2017-11-13 09:45
253 查看
【题目】
给定一个链表的头节点head,请判断该链表是否为回文结构。
进阶:如果链表长度为N,要求时间复杂度O(N),空间复杂度O(1)。
【基本思路】
方法一。时间复杂度O(N),空间复杂度O(N)。
使用栈,遍历一遍链表把每个节点都压入栈中,这样在弹出栈的时候,所有的节点就逆序了。依次对比原链表的每个节点即可。
方法二。时间复杂度O(N),空间复杂度O(N/2)。
也使用栈,但是这次只将链表的后半部分压入栈中,这样在弹出栈的时候,后半部分的节点就逆序了。依次对比链表的前半部分和逆序后的后半部分的每个节点即可。
方法三。时间复杂度O(N),空间复杂度O(1)。
首先改变链表右半区的结构,使整个右半区的指针反指,中间节点的next指向None。接下来从两端开始向中间依次对比即可。需要注意的是,再判断完毕后要将链表调整会原链表的结构。
给定一个链表的头节点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
相关文章推荐
- 链表问题——判断一个链表是否为回文结构
- 判断一个链表是否为回文结构
- 判断一个链表是否为回文结构
- 判断一个链表是否为回文结构(java实现)
- 链表之判断一个链表是否为回文结构(三)
- 判断一个链表是否为回文结构
- [链表] - 判断一个链表是否为回文结构
- java判断一个链表是否是回文结构
- Palindrome Linked List - LeetCode 判断一个链表是否是回文结构
- C++数据结构与算法之判断一个链表是否为回文结构的方法
- 链表之判断一个链表是否为回文结构(一)
- 判断一个链表是否为回文结构
- 判断一个链表是否是回文结构 Python 版
- 链表之判断一个链表是否为回文结构(二)
- 判断一个链表是否为回文结构
- 【数据结构】单链表—判断一个链表是否形成了环形结构 — 快慢指针
- 如何判断一个单向链表是否为回文链表(Palindrome Linked List)
- 判断链表是否为回文结构(时间、空间复杂度有要求)
- 判断一个链表是否回文(每日一道算法题)
- 判断一个单链表是否是回文链表