Python 大话数据结构之链表篇


今天复习了下 Python 基础, 顺表研究了下链表。链表真的非常非常重要滴,它是一种动态的线性数据结构,它是后面二分搜索树,红黑树巴拉巴拉的的基础,必须掌握。重要的事情说三遍。

学好链表!!!

学好链表!!!

学好链表!!!

不得不说, 用 Python 实现链表是真的爽。代码结构看着非常清晰明了。

链表有几个重要的特性,搞明白了这个,实现的逻辑就更加好写。

  • 链表是由节点组成,一个节点包含两个部分,一个数数据域,用来存储数据信息,另一个是指针域,用来存储指向下一个元素的指针
  • 它是一种递归的结构,对于后面的树的实现就是基于链表的混合组成,对于某些操作,它比数组的时间复杂度要低
  • 链表的第一个节点的数据为空,最后一个节点的指针域为空
  • 链表的优点是实现了真正的动态,不需要处理固定容量的问题,缺点:它丧失了随机访问的能力。

节点类的定义如下:

class Node(object):
    '''
    data 保存节点的数据
    next 保存下一个节点对象
    '''

    def __init__(self, data):
        self.data = data
        self.next = None  

然后,定义 LinkedList 的实现类,它分别有 append, insert, __len__, getIndex, delete 等接口。

class Node(object):
    '''
    data 保存节点的数据
    next 保存下一个节点对象
    '''

    def __init__(self, data):
        self.data = data
        self.next = None


class LinkedList(object):

    def __init__(self, head=None):
        self.head = head

    def __len__(self):
        # 输入头节点, 返回链表的长度
        curr = self.head
        counter = 0
        while curr is not None:
            counter += 1
            curr = curr.next
        return counter

    def addFirst(self, data):
        node = Node(data)
        node.next = self.head
        self.head = node

    def append(self, data):
        # 若数据为空 ,则返回 None
        if data is None:
            return None

        # 若头节点为空,直接将输入数据作为头节点
        node = Node(data)
        if self.head is None:
            self.head = node
            return node

        curr_node = self.head
        while curr_node.next is not None:
            curr_node = curr_node.next
        curr_node.next = node
        return node

    # 向任意位置插入一个数据
    def insert(self, index, data):
        prev_node = self.head
        for i in range(index):
            prev_node = prev_node.next
        node = Node(data)
        node.next = prev_node.next
        prev_node.next = node

    # 查找某个节点,时间复杂度为 O(n)
    def search(self, data):
        curr_node = self.head
        while curr_node is not None:
            if curr_node.data == data:
                return curr_node
            curr_node = curr_node.next
        return curr_node

    def getIndex(self, data):
        curr_node = self.head
        i = 0
        while curr_node is not None:
            if curr_node.data == data:
                return i
            curr_node = curr_node.next
            i += 1

        return '这个数不存在'

    def getItem(self, index):
        i = 0
        curr_node = self.head
        while curr_node is not None:
            if i == index:
                return curr_node.data
            curr_node = curr_node.next
            i += 1
        return None


if __name__ == '__main__':
    # node1 = Node(1)
    # node2 = Node(2)
    # node3 = Node(3)
    # node1.next = node2
    # node2.next = node3
    # node = node1
    # while node:
    #     print(node.data)
    #     node = node.next

    linklist = LinkedList()
    for i in range(9):
        linklist.append(i)
    print(linklist.__len__())
    linklist.addFirst(10)
    print(linklist.getIndex(10))
    print(linklist.getItem(0))
    print('='*30)
    linklist.insert(5, 50)
    curr = linklist.head
    while curr is not None:
        print(curr.data)
        curr = curr.next

  

优质内容筛选与推荐>>
1、在CentOS 7下安装配置Redis
2、【博弈论】HDU 5754 Life Winner Bo
3、L1-Day45
4、Nginx Location配置总结
5、java IO通过字节流,字符流 读出写入


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号





    联系我们

    欢迎来到TinyMind。

    关于TinyMind的内容或商务合作、网站建议,举报不良信息等均可联系我们。

    TinyMind客服邮箱:support@tinymind.net.cn