zoukankan      html  css  js  c++  java
  • 链表问题(5)-----读取

    一、题目:判断一个链表是否为回文结构

    简单思路:时间O(N),空间O(N)

    采用栈来存储链表值,再从栈中弹出值(逆序),如果和链表顺序值一样,则为回文结构。

    eg:1→2→1,顺序:121,倒序:121。则为回文。

    1→3→2,顺序:132,倒序:231,不为回文。

    代码:

    class Node:
        def __init__(self,value):
            self.value = value
            self.next = None
    def isPal(head):
        stack = []
        if not head:
            return False
        while head:
            stack.append(head.value)
            head = head.next
        if stack == stack[::-1]:
            return True
        else:
            return False
    head = Node(1)
    head.next = Node(2)
    head.next.next = Node(3)
    isPal(head)
            

    空间省一半的思路:时间O(N),空间O(N/2)

    栈中只存链表后一半的值。再与链表前一半对比。

    代码:

    class Node:
        def __init__(self,value):
            self.value = value
            self.next = None
    def isPal(head):
        if not head:
            return head
        stack = []
        cur , right = head , head
    #找到中间节点
    while cur.next and cur.next.next: right = right.next cur = cur.next.next
    #将链表右边部分存进栈中
    while right: stack.append(right) right = right.next
    #将栈和链表左半部分对比
    while stack: if head.value != stack[-1]: return False del stack[-1] head = head.next return True head = Node(1) head.next = Node(2) head.next.next = Node(3) isPal(head)

    进阶思路:时间O(N),空间O(1)

    将链表后半部分反转,再与前半部分对比,就不需要新的栈来存储。

    代码:

    class Node:
        def __init__(self,value):
            self.value = value
            self.next = None
    def isPal(head):
        if not head:
            return head
        cur , right = head , head
    #找到中间节点
    while cur.next and cur.next.next: right = right.next cur = cur.next.next mid = right first = right
    #将链表后半部分反转
    while right.next: temp = right.next right.next = right.next.next temp.next = first first = temp
    #将链表前半部分和后半部分对比
    while head: if first.value != head.value: return False first = first.next head = head.next return True head = Node(1) head.next = Node(2) head.next.next = Node(3) head.next.next.next = Node(3) head.next.next.next.next = Node(2) head.next.next.next.next.next = Node(1) isPal(head)

    二、题目:单链表生成相加链表

    简单思路:时间O(N),空间O(N)

    直接将链表中的数值读取出来转化成整型数据,再相加,之后再将值存储到链表中。但是这种做法有个问题,当链表长度太长,转成int时容易溢出。

    进阶思路1:时间O(N),空间O(N),用栈

    利用栈结构来存储链表中的数值,然后再每一位进行相加计算。

    代码:

    import queue
    class Node:
        def __init__(self,value):
            self.value = value
            self.next = None
    def mullist(head1,head2):
        if not head1 and not head2:
            return 0
        cur1 = head1
        cur2 = head2
        stack1 = queue.LifoQueue()
        stack2 = queue.LifoQueue()
        while cur1:
            stack1.put(cur1.value)
            cur1 = cur1.next
        while cur2:
            stack2.put(cur2.value)
            cur2 = cur2.next
        ca = 0 #进位符
        node , pre = Node(None) , Node(None)
        while not stack1.empty() or not stack2.empty():
            n1 = stack1.get() if not stack1.empty() else 0
            n2 = stack2.get() if not stack2.empty() else 0
            mul = ca + n1 + n2
            ca = mul // 10
            pre = node
            node = Node(mul%10)
            node.next = pre   
        if ca == 1:
            node = Node(1)
            pre = node
            node.next = pre
        return node
            
            
    if __name__ == '__main__':
        head1 = Node(1)
        p = head1
        for i in range(2,3):
            p.next = Node(i)
            p = p.next  
        head2 = Node(6)
        p1 = head2
        for i in range(7,8):
            p1.next = Node(i)
            p1 = p1.next      
        res = mullist(head1,head2)

     进阶思路2:利用链表的逆序求解,可以省掉用栈的空间,时间O(N),空间O(1)

  • 相关阅读:
    BigDecimal 类型数据比较大小
    list排序,顺序,倒序
    springboot添加log4j日志配置log4j.xml生成日志文件
    mybatis使用@param("xxx")注解传参和不使用的区别
    jetty 插件启动指定端口号
    javaweb项目静态资源被拦截的解决方法
    day15 Python全局变量和局部变量
    阿里云操作视频
    Python基础视频
    马哥Python视频
  • 原文地址:https://www.cnblogs.com/Lee-yl/p/9740496.html
Copyright © 2011-2022 走看看