Loading

数据结构与算法(三) --- 链表

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. 复制复杂链表

posted @ 2019-10-10 15:54  Geoffrey_one  阅读(184)  评论(0编辑  收藏  举报
/*
*/