浅谈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加密自己的密码
Aug 04 Python
详解Python如何获取列表(List)的中位数
Aug 12 Python
使用Eclipse如何开发python脚本
Apr 11 Python
Python3多线程基础知识点
Feb 19 Python
Python批量查询关键词微信指数实例方法
Jun 27 Python
python 实现的发送邮件模板【普通邮件、带附件、带图片邮件】
Jul 06 Python
python绘制多个子图的实例
Jul 07 Python
Python的log日志功能及设置方法
Jul 11 Python
微信公众号token验证失败解决方案
Jul 22 Python
基于torch.where和布尔索引的速度比较
Jan 02 Python
Window系统下Python如何安装OpenCV库
Mar 05 Python
python爬虫实现爬取同一个网站的多页数据的实例讲解
Jan 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
php zlib压缩和解压缩swf文件的代码
2008/12/30 PHP
php解析字符串里所有URL地址的方法
2015/04/03 PHP
php使用ftp实现文件上传与下载功能
2017/07/21 PHP
通过继承IHttpHandle实现JS插件的组织与管理
2010/07/13 Javascript
基于jquery的一个浮动框(扩展性比较好 )
2010/08/27 Javascript
使用POST方式弹出窗口的两种方法示例介绍
2014/01/29 Javascript
使用jQuery.wechat构建微信WEB应用
2014/10/09 Javascript
jQuery使用height()获取高度需要注意的地方
2014/12/13 Javascript
Javascript中call和apply函数的比较和使用实例
2015/02/03 Javascript
javascript数组去重的六种方法汇总
2015/08/16 Javascript
jquery实现select选择框内容左右移动代码分享
2015/11/21 Javascript
JS实现1000以内被3或5整除的数字之和
2016/02/18 Javascript
js实现省份下拉菜单效果
2017/02/15 Javascript
Nodejs基于LRU算法实现的缓存处理操作示例
2017/03/17 NodeJs
BootStrap Table前台和后台分页对JSON格式的要求
2017/06/28 Javascript
jQuery菜单实例(全选,反选,取消)
2017/08/28 jQuery
vue ssr 指南详读
2018/06/29 Javascript
Bootstrap标签页(Tab)插件切换echarts不显示问题的解决
2018/07/13 Javascript
Vue 应用中结合vux使用微信 jssdk的方法
2018/08/28 Javascript
使用typescript构建Vue应用的实现
2019/08/26 Javascript
JavaScript实现刮刮乐效果
2020/11/01 Javascript
三剑客:offset、client和scroll还傻傻分不清?
2020/12/04 Javascript
python发布模块的步骤分享
2014/02/21 Python
python将文本中的空格替换为换行的方法
2018/03/19 Python
判断python字典中key是否存在的两种方法
2018/08/10 Python
react+django清除浏览器缓存的几种方法小结
2019/07/17 Python
python 读取数据库并绘图的实例
2019/12/03 Python
Python坐标轴操作及设置代码实例
2020/06/04 Python
python 递归相关知识总结
2021/03/03 Python
CSS3实现曲线阴影和翘边阴影
2016/05/03 HTML / CSS
CSS3实现多重边框的方法总结
2016/05/31 HTML / CSS
春节联欢会策划方案
2014/05/16 职场文书
社区领导班子四风问题原因分析及整改措施
2014/09/28 职场文书
2014年党建工作汇报材料
2014/11/02 职场文书
2015年中个人总结范文
2015/03/10 职场文书
Python Matplotlib绘制条形图的全过程
2021/10/24 Python