浅谈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 相关文章推荐
Python基于pygame实现的弹力球效果(附源码)
Nov 11 Python
Python安装模块的常见问题及解决方法
Feb 05 Python
Django实现登录随机验证码的示例代码
Jun 20 Python
Python这样操作能存储100多万行的xlsx文件
Apr 16 Python
python3.5 cv2 获取视频特定帧生成jpg图片
Aug 28 Python
余弦相似性计算及python代码实现过程解析
Sep 18 Python
Pytorch中index_select() 函数的实现理解
Nov 19 Python
python实现画出e指数函数的图像
Nov 21 Python
Python numpy.zero() 初始化矩阵实例
Nov 27 Python
Python restful框架接口开发实现
Apr 13 Python
Python脚本打包成可执行文件过程解析
Oct 20 Python
python批量提取图片信息并保存的实现
Feb 05 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
php控制linux服务器常用功能 关机 重启 开新站点等
2012/09/05 PHP
php的ajax简单实例
2014/02/27 PHP
谈谈你对Zend SAPIs(Zend SAPI Internals)的理解
2015/11/10 PHP
TextArea设置MaxLength属性最大输入值的js代码
2012/12/21 Javascript
js中window.open()的所有参数详细解析
2014/01/09 Javascript
jQuery过滤选择器用法分析
2015/02/10 Javascript
jquery实现的伪分页效果代码
2015/10/29 Javascript
Vue2实现组件props双向绑定
2016/12/02 Javascript
Bootstrap实现渐变顶部固定自适应导航栏
2020/08/27 Javascript
angular4 JavaScript内存溢出问题
2018/03/06 Javascript
vue-router传递参数的几种方式实例详解
2018/11/13 Javascript
Node.JS在命令行中检查Chrome浏览器是否安装并打开指定网址
2019/05/21 Javascript
微信小程序位置授权处理方法
2019/06/13 Javascript
[39:46]完美世界DOTA2联赛PWL S2 LBZS vs Rebirth 第二场 11.25
2020/11/25 DOTA
Python实现求两个csv文件交集的方法
2017/09/06 Python
python安装模块如何通过setup.py安装(超简单)
2018/05/05 Python
python实现复制大量文件功能
2019/08/31 Python
python实现小世界网络生成
2019/11/21 Python
python读取raw binary图片并提取统计信息的实例
2020/01/09 Python
Python实现屏幕录制功能的代码
2020/03/02 Python
python安装后的目录在哪里
2020/06/21 Python
通过CSS3的object-fit来调整图片适配尺寸的技巧简介
2016/02/27 HTML / CSS
日本著名的平价时尚女性购物网站:Fifth
2016/08/24 全球购物
美国在线眼镜商城:Eyeglasses.com
2017/06/26 全球购物
芝加哥牛排公司:Chicago Steak Company
2018/10/31 全球购物
测绘工程个人的自我评价
2013/11/10 职场文书
总经理秘书工作职责
2013/12/26 职场文书
初一学生评语大全
2014/04/24 职场文书
党员创先争优活动总结
2014/05/04 职场文书
大学国际贸易专业自荐信
2014/06/05 职场文书
工商管理自荐书
2014/07/06 职场文书
2015年度个人思想工作总结
2015/04/08 职场文书
运动会闭幕式致辞
2015/07/29 职场文书
小学二年级班主任工作经验交流材料
2015/11/02 职场文书
手把手教你导入Go语言第三方库
2021/08/04 Golang
Win11查看设备管理器
2022/04/19 数码科技