📌  相关文章
📜  数据结构示例-判断单向链表是否有回文(1)

📅  最后修改于: 2023-12-03 14:54:57.332000             🧑  作者: Mango

数据结构示例-判断单向链表是否有回文

单向链表是指链表的每个节点只有一个指针,指向下一个节点。判断一个单向链表是否是回文的,可以使用双指针法和栈来实现。下面我们将介绍两种实现方法。

双指针法

双指针法是指使用两个指针,一个指向头节点,另一个指向尾节点,然后逐个判断节点的值是否相等。具体实现如下:

def is_palindrome(head):
    if not head or not head.next:
        return True
    
    # 找到中间节点
    slow, fast = head, head
    while fast and fast.next:
        slow = slow.next
        fast = fast.next.next
    
    # 翻转后半部分链表
    prev, cur = None, slow
    while cur:
        cur.next, prev, cur = prev, cur, cur.next
    
    # 比较前半部分和翻转后的后半部分链表
    while prev and head:
        if prev.val != head.val:
            return False
        prev = prev.next
        head = head.next
    
    return True

该算法的时间复杂度为 O(n),空间复杂度为 O(1)。

栈是一种后进先出的数据结构,我们可以用栈来保存链表的前半部分节点。具体实现如下:

def is_palindrome(head):
    if not head or not head.next:
        return True
    
    # 找到中间节点
    slow, fast = head, head
    while fast and fast.next:
        slow = slow.next
        fast = fast.next.next
    
    # 将前半部分节点入栈
    stack = []
    cur = head
    while cur != slow:
        stack.append(cur)
        cur = cur.next
    
    # 判断链表是否有奇数个节点
    if fast:
        cur = cur.next
    
    # 比较栈和后半部分链表
    while cur:
        if stack.pop().val != cur.val:
            return False
        cur = cur.next
    
    return True

该算法的时间复杂度为 O(n),空间复杂度为 O(n)。