浅谈Python单向链表的实现


Posted in Python onDecember 24, 2015

链表由一系列不必在内存中相连的结构构成,这些对象按线性顺序排序。每个结构含有表元素和指向后继元素的指针。最后一个单元的指针指向NULL。为了方便链表的删除与插入操作,可以为链表添加一个表头。

浅谈Python单向链表的实现

删除操作可以通过修改一个指针来实现。

浅谈Python单向链表的实现

插入操作需要执行两次指针调整。

浅谈Python单向链表的实现

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)

全部代码

class Node():
  __slots__=['_item','_next']
  def __init__(self,item):
    self._item=item
    self._next=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
     
class SingleLinkedList(): 
  def __init__(self):
    self._head=None #初始化为空链表
  def isEmpty(self):
    return self._head==None
  def size(self):
    current=self._head
    count=0
    while current!=None:
      count+=1
      current=current.getNext()
    return count
  def travel(self):
    current=self._head
    while current!=None:
      print current.getItem()
      current=current.getNext()
  def add(self,item):
    temp=Node(item)
    temp.setNext(self._head)
    self._head=temp
 
  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为链表最后的元素
  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
  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       
  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()           
  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)
 
if __name__=='__main__':
  a=SingleLinkedList()
  for i in range(1,10):
    a.append(i)
  print a.size()
  a.travel()
  print a.search(6)
  print a.index(5)
  a.remove(4)
  a.travel()
  a.insert(4,100)
  a.travel()
Python 相关文章推荐
Python3基础之条件与循环控制实例解析
Aug 13 Python
Python中列表(list)操作方法汇总
Aug 18 Python
Python上传package到Pypi(代码简单)
Feb 06 Python
TensorFlow实现卷积神经网络CNN
Mar 09 Python
python实现list由于numpy array的转换
Apr 04 Python
Python实现基于POS算法的区块链
Aug 07 Python
python K近邻算法的kd树实现
Sep 06 Python
numpy.random.shuffle打乱顺序函数的实现
Sep 10 Python
淘宝秒杀python脚本 扫码登录版
Sep 19 Python
学Python 3的理由和必要性
Nov 19 Python
python双端队列原理、实现与使用方法分析
Nov 27 Python
Python叠加矩形框图层2种方法及效果
Jun 18 Python
Python使用面向对象方式创建线程实现12306售票系统
Dec 24 #Python
安装ElasticSearch搜索工具并配置Python驱动的方法
Dec 22 #Python
Python生成随机验证码的两种方法
Dec 22 #Python
基于python实现微信模板消息
Dec 21 #Python
python如何实现远程控制电脑(结合微信)
Dec 21 #Python
python从入门到精通(DAY 3)
Dec 20 #Python
python从入门到精通(DAY 2)
Dec 20 #Python
You might like
Zerg剧情介绍
2020/03/14 星际争霸
php反射应用示例
2014/02/25 PHP
在PHP中输出JS语句以及乱码问题的解决方案
2019/02/13 PHP
基础的prototype.js常用函数及其用法
2007/03/10 Javascript
Javascript生成json的函数代码(可以用php的json_decode解码)
2012/06/11 Javascript
JavaScript获取和设置CheckBox状态的简单方法
2013/07/05 Javascript
Extjs grid添加一个图片状态或者按钮的方法
2014/04/03 Javascript
单元选择合并变色示例代码
2014/05/26 Javascript
jquery delay()介绍及使用指南
2014/09/02 Javascript
jQuery中[attribute^=value]选择器用法实例
2014/12/31 Javascript
jquery.cookie.js使用指南
2015/01/05 Javascript
Javascript与jQuery方法的隐藏与显示
2015/01/19 Javascript
js实现的二级横向菜单条实例
2015/08/22 Javascript
H5移动端适配 Flexible方案
2016/10/24 Javascript
关于vue v-for 循环问题(一行显示四个,每一行的最右边那个计算属性)
2018/09/04 Javascript
JavaScript对象字面量和构造函数原理与用法详解
2020/04/18 Javascript
vue 页面回退mounted函数不执行的解决方案
2020/07/26 Javascript
[03:40]DOTA2抗疫特别篇《英雄年代》
2020/02/28 DOTA
解决Djang2.0.1中的reverse导入失败的问题
2019/08/16 Python
Python 实现OpenCV格式和PIL.Image格式互转
2020/01/09 Python
python编写扎金花小程序的实例代码
2021/02/23 Python
加拿大床上用品、家居装饰、厨房和浴室产品购物网站:Linen Chest
2018/06/05 全球购物
英国最大的独立摄影零售商:Park Cameras
2019/11/27 全球购物
采购部主管岗位职责
2014/01/01 职场文书
打架检讨书800字
2014/01/10 职场文书
八项规定整改措施
2014/02/12 职场文书
年度考核自我鉴定
2014/03/19 职场文书
马丁路德金演讲稿
2014/05/19 职场文书
国贸专业毕业求职信
2014/06/11 职场文书
工程学毕业生自荐信
2014/06/14 职场文书
民族团结演讲稿范文
2014/08/27 职场文书
银行授权委托书范本
2014/10/04 职场文书
企业开业庆典答谢词
2015/01/20 职场文书
2015年行政助理工作总结
2015/04/30 职场文书
学校工会工作总结2015
2015/05/19 职场文书
小学三年级语文教学反思
2016/03/03 职场文书