关闭

Python数据结构——链表

标签: python链表
197人阅读 评论(0) 收藏 举报
分类:

Python中的list是基于array实现的。但无论是list还是array在数据存储和操作层面都有一些缺点。例如在插入和删除元素时都要移动元素,这在数据量旁大时就需要很大开销。array大小是固定的,无法更改;虽然list是可扩展的,但这也是有其代价的。别忘了list是基于array实现的,这就意味着list的每次扩展都要创建更大的array,然后把原来的array拷贝过来。array需要存储在连续的内存单元中,无论这个array多大。所以每次创建array都要划分一块完整的内存出来。如果这个array很庞大,程序动态分配内存就很难甚至不肯能。
链表(linked list)这一数据结构可以解决以上问题。
下面是一个链表的实现
用单向链表实现一个Bag ADT

class Bag:
    #构造一个空bag
    def __init__(self):
        self._head = None
        self._size = 0

    # 返回bag大小
    def __len__(self):
        return self._size

    # 查看元素是否在bag中
    def __contains__(self, target):
        curNode = self._head
        while curNode is not None and curNode.item != target:
            curNode = curNode.next
        return curNode is not None

    # 添加一个新元素到bag
    def add(self, item):
        newNode = _BagListNode(item)
        newNode.next = self._head
        self._head = newNode
        self._size += 1

    # 从bag中移除一个元素
    def remove(self, item):
        predNode = None
        curNode = self._head
        while curNode is not None and curNode.item != item:
            predNode = curNode
            curNode = curNode.next
        assert curNode is not None, "元素必须存在于bag中"

        #断开连接返回元素
        self._size -= 1
        if curNode is self._head :
            self._head = curNode.next
        else :
            predNode.next = curNode.next
        return curNode.item
    def __iter__(self):
        return _BagIterator(self._head)

#为创建链表节点定义一个私有存储类
class _BagListNode(object):
    def __init__(self, item):
        self.item = item
        self.next = None

#使用链表实现的一个迭代器
class _BagIterator :
    def __init__(self, listHead):
        self._curNode = listHead

    def __iter__(self):
        return self
    def next(self):
        if self._curNode is None:
            raise StopIteration
        else:
            item = self._curNode.item
            self._curNode = self._curNode.next

以下为该模块的使用以及控制台的输出

bag = Bag()
bag.add(10)
bag.add("china")
bag.add(45)
print(len(bag))
print(45 in bag)
print(len(bag))
bag.remove(10)
print(len(bag))

控制台输出
这里写图片描述

0
0
查看评论

python数据结构学习笔记-4-链表

链表
  • hjh00
  • hjh00
  • 2015-11-09 15:13
  • 857

Python 数据结构与算法——列表(链表,linked list)

Python 中的 list 并不是我们传统(计算机科学)意义上的列表,这也是其 append 操作会比 insert 操作效率高的原因。传统列表——通常也叫作链表(linked list)——通常是由一系列节点(node)来实现的,其每一个节点(尾节点除外)都持有一个指向下一个节点的引用。其简单实...
  • lanchunhui
  • lanchunhui
  • 2016-03-21 08:00
  • 8180

链表的理解与实现[数据结构]

一、链表的定义n个节点离散分配,节点之间通过指针相连。除了首节点和尾节点之外,每个节点都只有一个前驱结点和一个后继节点。 如下图: 大家有没有发现,链表的结构很像一种交通工具,什么呢? 火车。(节点==车厢,指针==车厢间相连的绳索)二、链表的实现注意,这里实现的是链表中最简单的单链表。1...
  • u011509781
  • u011509781
  • 2016-01-27 14:02
  • 1968

数据结构之:链表详解

11
  • lishuzhai
  • lishuzhai
  • 2016-03-31 17:13
  • 13395

链表相关的算法题大汇总 — 数据结构之链表奇思妙想

声明:转自http://hi.baidu.com/lanxuezaipiao/item/afc616caf8393a155050585b 基本函数 1,构造节点:  //定义节点类型 struct Node { int value; Node*next; };   2,分配节...
  • lanxuezaipiao
  • lanxuezaipiao
  • 2014-03-25 21:18
  • 2814

【数据结构】链表的原理及与其相关的常见面试题总结

链表是一种数据结构,和数组同级。比如,Java中我们使用的ArrayList,其实现原理是数组。而LinkedList的实现原理就是链表了。链表在进行循环遍历时效率不高,但是插入和删除时优势明显。下面对单向链表做一个介绍。 单向链表是一种线性表,实际上是由节点(Node)组成的,一个...
  • jianyuerensheng
  • jianyuerensheng
  • 2016-06-06 09:49
  • 1361

数据结构:链表(linked-list)

链表分为单向链表(Singly linked lis)、双向链表(Doubly linked list)、循环链表(Circular Linked list)。
  • juanqinyang
  • juanqinyang
  • 2016-05-09 11:09
  • 3338

数据结构(栈,队列,链表,二叉树)

栈栈作为一种数据结构,用途十分广泛。在回调函数等许多场景中都有应用。我们需要了解它的基本用途,那就是先进后出和队列的先进先出正好相反。最近在学习数据结构和算法,于是自己来实现。我特别喜欢C语言的指针,我发现很好用,于是用C++来实现一个简单的范例。 主要实现就是函数就是Pop,Push Push...
  • u013766436
  • u013766436
  • 2016-05-04 17:03
  • 1938

数据结构时间复杂度和空间复杂度

数据结构时间复杂度
  • qq_36411874
  • qq_36411874
  • 2017-02-25 12:00
  • 277

数据结构概述<2>链表的基本概念

链表概述
  • bing_bing304
  • bing_bing304
  • 2014-12-02 21:42
  • 819
    个人资料
    • 访问:9656次
    • 积分:360
    • 等级:
    • 排名:千里之外
    • 原创:13篇
    • 转载:5篇
    • 译文:14篇
    • 评论:3条