面试宝典之python数据结构---列表,栈与队列,链表,树,字典

本文详细介绍了Python中的基本数据结构,包括线性表的实现方式,如列表和链表,以及栈、队列的操作。文章探讨了列表的增删查改操作,链表的单链表、循环链表实现,以及栈和队列的原理。此外,还讲解了树与二叉树的概念,如二叉查找树的特性,并提供了相关算法实现和示例。
摘要由CSDN通过智能技术生成

Python基本数据结构

一、线性表

线性表是最常用且最简单的一种数据结构,它是n个数据元素的有限序列。

实现线性表的方式一般有两种,一种是使用数组存储线性表的元素,即用一组连续的存储单元依次存储线性表的数据元素。另一种是使用链表存储线性表的元素,即用一组任意的存储单元存储线性表的数据元素(存储单元可以是连续的,也可以是不连续的)。

列表list

list的显著特征

  • 列表中的每个元素都可变的,意味着可以对每个元素进行修改和删除
  • 列表是有序的,每个元素的位置是确定的,可以用索引去访问每个元素
  • 列表中的元素可以是Python中的任何对象
    可以为任意对象就意味着元素可以是字符串、整数、元组、也可以是list等Python中的对象。
x = [1,2,3]
y = {
  'name':'Sakura'}
z="Test"
a=[x,y,z]
a
[[1, 2, 3], {
  'name': 'Sakura'}, 'Test']
list中的正反索引

这里写图片描述

list中的增删查改
  1. 利用insert()和分片将元素添加到指定位置 , 利用remove()和关键字del对
    元素进行删除

    需要注意分片[a:b]中的位置不包含位置b,利用[a,a]可以将元素添加至a位置

    本Markdown编辑器使用[StackEdit][6]修改而来,用它写博客,将会带来全新的体验哦:
    这里写图片描述
    这里写图片描述

    1. 利用正反索引对元素进行查找
    2. 对元素修改可以直接赋值替换
    3. 列表中还有其他方法如pop()删除末尾元素,pop(i)删除指定位置i的元素,append()向末尾添加元素。

可以通过list将序列创建为列表
Python中包含6中內建的序列:列表,元组,字符串、Unicode字符串、buffer对象和xrange对象。

链表

链表的结构:链表像锁链一样,由一节节节点连在一起,组成一条数据链。
链表的节点的结构如下:
data next
data为自定义的数据,next为下一个节点的地址。
链表的结构为,head保存首位节点的地址:
这里写图片描述

单链表

接下来我们来用python实现链表

python实现链表

首先,定义节点类Node:

class Node:
    '''
    data: 节点保存的数据
    _next: 保存下一个节点对象
    '''
    def __init__(self, data, pnext=None):
        self.data = data
        self._next = pnext

    def __repr__(self):
        '''
        用来定义Node的字符输出,
        print为输出data
        '''
        return str(self.data)

然后,定义链表类:

链表要包括:

属性:

链表头:head

链表长度:length

方法:

判断是否为空: isEmpty()

def isEmpty(self):
    return (self.length == 0

增加一个节点(在链表尾添加): append()

def append(self, dataOrNode):
    item = None
    if isinstance(dataOrNode, Node):
        item = dataOrNode
    else:
        item = Node(dataOrNode)

    if not self.head:
        self.head = item
        self.length += 1

    else:
        node = self.head
        while node._next:
            node = node._next
        node._next = item
        self.length += 1

删除一个节点: delete()

#删除一个节点之后记得要把链表长度减一
def delete_node(self, index):
    if self.isEmpty():
        print '[*]This ChainTable is Empty!'
        return

    if index < 0 or index >= self.length:
        print '[*]Error! index out of range!'
        return

    if index == 0:
        self.head = self.head._next
        self.length -= 1
        return

    j = 0
    node = self.head
    prev = self.head

    while node._next and j < index:
        prev = node
        node = node._next
        j += 1

    if j == index:
        prev._next = node._next
        self.length -= 1

    print 'Success delete a node'

修改一个节点: update()

def update(self, index, data):
    if self.isEmpty():
        print '[*]This ChainTable is Empty!'
        return

    if index < 0 or index >= self.length:
        print '[*]Error! index out of range!'
        return

    j = 0
    node = self.head
    while node._next and j < index:
        node = node._next
        j += 1

    if j == index:
        node.data = data
    print 'Success update a node'

查找一个节点: getItem()

def getitem(self, index):
    if self.isEmpty():
        print '[*]This ChainTable is Empty!'
        return
    if index < 0 or index >= self.length:
        print '[*]Error! index out of range!'
        return

    j = 0
    node = self.head
    while node._next and j < index:
        node = node._next
        j += 1

    if j == index:
        return node.data
    #print 'Success get a node value'

查找一个节点的索引: getIndex()

def getindex(self, data):
    if self.isEmpty():
        print '[*]This ChainTable is Empty!'
        return

    j = 0
    node = self.head
    while node:
        if node.data == data:
            return j
  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值