博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python 大话数据结构之链表篇
阅读量:6649 次
发布时间:2019-06-25

本文共 2919 字,大约阅读时间需要 9 分钟。

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

学好链表!!!

学好链表!!!

学好链表!!!

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

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

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

节点的定义类如下

class Node(object):    '''    data 保存节点的数据    next 保存下一个节点对象    '''    def __init__(self, data):        self.data = data        self.next = None  复制代码

然后,定义 LinkedList 的实现类

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 Noneif __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复制代码

转载于:https://juejin.im/post/5baa1d11f265da0af609b504

你可能感兴趣的文章
jqueryMobile框架页面与页面切换
查看>>
对PostgreSQL中tablespace 与 database, table的理解
查看>>
图像编辑之一键特效(Lomo,反转负冲,柔光)
查看>>
android中checkbox的padding引发的问题
查看>>
mvn dependency:tree
查看>>
使用GoodFeaturesToTrack进行关键点检测---29
查看>>
Android自定义控件View(一)
查看>>
使用下拉列表框<select>标签,节省空间
查看>>
参考SQLHelper编写的OracleHelper
查看>>
C/C++中的getline函数总结:
查看>>
[Angular 2] Handle Reactive Async opreations in Service
查看>>
linux下操作PostgreSQL的常用命令
查看>>
C# Webservice
查看>>
Spring学习笔记1——IOC: 尽量使用注解以及java代码(转)
查看>>
【转】雪崩光电二极管(APD)偏置电源及其电流监测
查看>>
iOS设置圆角的三种方式
查看>>
C#ShowCursor光标的显示与隐藏
查看>>
PHP 正则表达式匹配函数 preg_match 与 preg_match_all
查看>>
关于CAShapeLayer的一些实用案例和技巧
查看>>
Unity又称Unity Application Block
查看>>