python中的链表

  python中的链表(linked list)是一组数据项的集合,其中每个数据项都是一个节点的一部分,每个节点还包含指向下一个节点的链接。链表的数据结构如下图所示

在链表中删除操作可以通过修改指针来实现,如下图所示:

插入则是调整,插入点的前后两个指针的指向关系,如下图所示:

  在python中每个变量都是指针,例如:

用内置数据结构(list, dict, tuple等)的嵌套/组合,它们隐式地包含了指向/嵌套关系,如graph[u][v]={w0,w1..}类的成员变量、嵌套类可能包含了指向/嵌套关系;

引用表示指向关系,只不过引用不能像指针一样运算,比如 p + 1 指向下一个元素,所以可能限制颇多.因此,要实现链表的操作,不能和c一样直接对指针进行操作.

1. 单向链表的实现
1.1 Node实现

  每个Node分为两部分。一部分含有链表的元素,可以称为数据域;另一部分为一指针,指向下一个Node。

class Node():
    __slots__=[‘_item‘,‘_next‘]    #限定Node实例的属性
    def __init__(self,item):
        self._item=item
        self._next=None     #Node的指针部分默认指向None
    def getItem(self):
        return self._item
    def getNext(self):
        return self._next
    def setItem(self,newitem):
        self._item=newitem
    def setNext(self,newnext):
        self._next=newnext

1.2 SinglelinkedList的实现

class SingleLinkedList():
    def __init__(self):
        self._head=None    #初始化链表为空表
        self._size=0

1.3 检测链表是否为空

def isEmpty(self):
    return self._head==None 

1.4 add在链表前端添加元素

def add(self,item):
    temp=Node(item)
    temp.setNext(self._head)
    self._head=temp

1.5 append在链表尾部添加元素

def append(self,item):
    temp=Node(item)
    if self.isEmpty():
        self._head=temp   #若为空表,将添加的元素设为第一个元素
    else:
        current=self._head
        while current.getNext()!=None:
            current=current.getNext()   #遍历链表
        current.setNext(temp)   #此时current为链表最后的元素

1.6 search检索元素是否在链表中

def search(self,item):
    current=self._head
    founditem=False
    while current!=None and not founditem:
        if current.getItem()==item:
            founditem=True
        else:
            current=current.getNext()
    return founditem

1.7 index索引元素在链表中的位置

def index(self,item):
    current=self._head
    count=0
    found=None
    while current!=None and not found:
        count+=1
        if current.getItem()==item:
            found=True
        else:
            current=current.getNext()
    if found:
        return count
    else:
        raise ValueError,‘%s is not in linkedlist‘%item

1.8 remove删除链表中的某项元素

def remove(self,item):
    current=self._head
    pre=None
    while current!=None:
        if current.getItem()==item:
            if not pre:
                self._head=current.getNext()
            else:
                pre.setNext(current.getNext())
            break
        else:
            pre=current
            current=current.getNext()

1.9 insert链表中插入元素

def insert(self,pos,item):
   if pos<=1:
       self.add(item)
   elif pos>self.size():
       self.append(item)
   else:
       temp=Node(item)
       count=1
       pre=None
       current=self._head
       while count<pos:
           count+=1
           pre=current
           current=current.getNext()
       pre.setNext(temp)
       temp.setNext(current)

原文地址:https://www.cnblogs.com/turboliu/p/10208024.html

时间: 2024-10-06 22:33:17

python中的链表的相关文章

python中的链表推导式

python中的链表推导式 博客分类: Python Python Python代码   num=[1,2,3] myvec=[[x,x*2] for x in num] #嵌套一个链表,格式为一个数和他的平方 print myvec 生成链表很简单的一种办法就是链表推导式,不仅容易看懂,还很好用: 链表表达式在for语句前面,for后面就是对参数的限定.[XXX for yyy](必须要有方括号表示是链表),XXX表示链表,yyy限定XXX中参数. 例子: Python代码   num=[1,

Python中list,tuple,dict,set的区别和用法

Python语言简洁明了,可以用较少的代码实现同样的功能.这其中Python的四个内置数据类型功不可没,他们即是list, tuple, dict, set.这里对他们进行一个简明的总结. List 字面意思就是一个集合,在Python中List中的元素用中括号[]来表示,可以这样定义一个List: L = [12, 'China', 19.998] 可以看到并不要求元素的类型都是一样的.当然也可以定义一个空的List: L = [] Python中的List是有序的,所以要访问List的话显然

python中is和==的区别

Python中  is 和 == 的区别的笔记 在 Python 中一切都是对象,毫无例外整数也是对象,对象之间比较是否相等可以用==,也可以用is.==和is操作的区别是: is比较的是两个对象的id值是否相等,也就是比较俩对象是否为同一个实例对象,是否指向同一个内存地址. ==比较的是两个对象的内容是否相等,默认会调用对象的__eq__()方法. 清楚is和==的区别之后,对此也许你有可能会遇到下面的这些困惑,于是就有了这样一篇文章,试图把Python中一些隐晦的东西趴出来,希望对你有一定的

Python中的高级数据结构(转)

add by zhj: Python中的高级数据结构 数据结构 数据结构的概念很好理解,就是用来将数据组织在一起的结构.换句话说,数据结构是用来存储一系列关联数据的东西.在Python中有四种内建的数据 结构,分别是List.Tuple.Dictionary以及Set.大部分的应用程序不需要其他类型的数据结构,但若是真需要也有很多高级数据结构可供 选择,例如Collection.Array.Heapq.Bisect.Weakref.Copy以及Pprint.本文将介绍这些数据结构的用法,看 看它

Python中的内存管理机制

Python是如何进行内存管理的 python引用了一个内存池(memory pool)机制,即pymalloc机制,用于管理对小块内存的申请和释放 1.介绍 python和其他高级语言一样,会进行自动的内存管理.它使用引用计数机制检测为对象分配的内存是否可以被释放.然后,在Python中内存永远不会返还给操作系统,Python会持有这些内存并在需要时重新使用它们.在很多场景下,这个特性可以减少内存申请和释放所带来的性能损耗:但对于需要长时间运行的Python进程来讲,Python将会占用大量的

警惕Python中重复运算符(*)的坑

其实这个问题网上有很多人都提到了,但是之前一直没注意这个事,直到最近自己被坑了一把. Python中貌似不能直接定义指定长度的序列(tuple.list等),但是可以通过重复运算符乘号来重复构建一个序列以达到指定长度: seq = [ {} ] * 10 这样就构建了一个初始长度为10的字典列表.但是这行表面人畜无害的代码却暗藏危机,因为这个链表中的10个字典引用其实指向了同一个字典实例!换一种等效的写法也许看上去更加清楚: tmp = {} seq = [ tmp ] * 10 估计大部分情况

《python源码剖析》笔记 python中的整数对象

本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie 1. PyIntObject --> long的一个简单包装 typedef struct{ PyObject_HEAD long ob_ival; } PyIntObject; PyInt_Type --> PyIntObject的类型对象.与对象相关的元信息实际上都是保存在与对象对应的类型对象中的 PyTypeObject PyInt_Type = { PyObject_HEAD_I

Python中内置数据类型list,tuple,dict,set的区别和用法

Python语言简洁明了,可以用较少的代码实现同样的功能.这其中Python的四个内置数据类型功不可没,他们即是list, tuple, dict, set.这里对他们进行一个简明的总结. (原链接:http://www.jb51.net/article/76339.htm) List 字面意思就是一个集合,在Python中List中的元素用中括号[]来表示,可以这样定义一个List: ? 1 L = [12, 'China', 19.998] 可以看到并不要求元素的类型都是一样的.当然也可以定

python中几个常见的“黑盒子”之 列表list

python常见的数据类型有:字符串,布尔类型,整数,浮点数,数字,日期,列表,元祖,字典.相信前面6个大家都非常的熟悉,但是对于python的列表,元祖,字典我有时候一直在想其内部的实现是怎么样子的,它们就像一个"黑盒子"一样,下面记录一下对于"列表 list"理解过程: 其实,在最开始我一直以为python的列表是通过链表实现的,直到一天,应该说是误打误撞,当我通过交互模式创建一个列表的时候,然后通过id()函数打印出列表中每个元素的地址时,我发现它们的地址是连