zoukankan      html  css  js  c++  java
  • 数据结构与算法(三) --- 链表

    1. python实现单链表

    
    class Node:
        '''
        节点类, 用于存储数据和地址
        '''
        def __init__(self, data, next=None):
            self._data = data
            self._next = next
    
        def __repr__(self):
            return str(self._data)
    
    class ChainTable:
        '''
        链表类, 实现添加元素方法
        '''
        def __init__(self, head=Node(None), length=0):
            self.head = head
    
        def is_empty(self):
            # 判断是否为空
            return self.head._data == None
    
        def append(self, data):
            # 在链表末尾插入元素
            # 判断插入的数据类型
            if not isinstance(data, Node):
                data = Node(data)
    
            # 判断带插入的链表长度
            if self.is_empty():
                self.head = data
            else:
                curr = self.head
                while(curr._next):
                    curr = curr._next
                curr._next = data
        
    
        def __repr__(self):
            node = self.head
            result = []
            while node:
                result.append(node._data)
                node = node._next
            return str( result )
    
    if __name__ == '__main__':
        temp = ChainTable()
        temp.append(1)
        temp.append('2')
        temp.append('4444')
        print('链表:', temp)
    

    运行结果:

    2. 链表从尾到头打印

    
    def print_reval(l):
        curr = l.head
        result = [curr._data]
        while curr._next:
            curr = curr._next
            result.insert(0, curr._data)
        return result
    
    if __name__ == '__main__':
        print(temp)
        print(print_reval(temp))
    

    3. 链表中倒数第k个节点(k = 3)

    def the_last_k_elemt(l, k):
        node1, node2 = l.head, l.head
        for _ in range(k):
            node1 = node1._next
            
        while node1._next:
            node1 = node1._next
            node2 = node2._next
        return node2._next._data
    
    if __name__ == '__main__':
        print(the_last_k_elemt(temp, 4))
    

    4. 翻转链表

    
    from copy import deepcopy
    
    def reverse_linked_list(l):
        l = deepcopy(l)
        post = Node(None)
        curr = l.head
        while curr._next:
            next = curr._next
            curr._next = post
            post = curr
            curr = next
        l.head = curr
        curr._next = post
        return l
    
    if __name__ == '__main__':
        print(reverse_linked_list(temp))
    

    5. 合并两个单调递增链表

    def merge_linked_list_1(*args):
        args = list(args)
        result_linked_list = ChainTable()
        out = result_linked_list.head
    
        while args:
            min = int(np.argmin([i._data for i in args]))
            if out._data == None:
                out._data = args[min]._data
                # out = deepcopy(args[min]) # 仍然想不通这句为什么出错
            else:
                out._next = args[min]
                out = out._next
            if not args[min]._next:
                args.pop(min)
            else:
                args[min] = args[min]._next
        return result_linked_list
    
    if __name__ == '__main__':
        a = ChainTable()
        b = ChainTable()
        a.append(1)
        a.append(3)
        a.append(5)
        a.append(6)
        b.append(2)
        b.append(4)
        b.append(7)
        b.append(8)
        result = merge_linked_list_1(a.head, b.head)
        print(result)
    

    6. 复制复杂链表

  • 相关阅读:
    VSTO资源
    Windows Server 2008启用无线网络服务支持(转)
    [转载]数据库设计三大范式应用实例剖析
    C#如何为winform程序打包发布应用(图解)
    XPO学习一(获取数据库服务器时间)
    php中echo和print的区别
    isset()
    asp.net文本编辑器FCKeditor详解
    ASP.net 上传大文件问题
    StringBuilder与string和String的区别
  • 原文地址:https://www.cnblogs.com/geoffreyone/p/11648548.html
Copyright © 2011-2022 走看看