浅谈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读取Android permission文件
Nov 01 Python
Python实现获取操作系统版本信息方法
Apr 08 Python
利用Python的Django框架中的ORM建立查询API
Apr 20 Python
python构建自定义回调函数详解
Jun 20 Python
Python 实现引用其他.py文件中的类和类的方法
Apr 29 Python
Pipenv一键搭建python虚拟环境的方法
May 22 Python
python获取微信企业号打卡数据并生成windows计划任务
Apr 30 Python
Django框架之中间件MiddleWare的实现
Dec 30 Python
python如何实现单链表的反转
Feb 10 Python
Django choices下拉列表绑定实例
Mar 13 Python
python 实现单例模式的5种方法
Sep 23 Python
python对输出的奇数偶数排序实例代码
Dec 04 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中遇到的时区问题解决方法
2015/07/23 PHP
利用laravel+ajax实现文件上传功能方法示例
2017/08/13 PHP
初窥JQuery-Jquery简介 入门了解篇
2010/11/25 Javascript
原生javascript获取元素样式属性值的方法
2010/12/25 Javascript
js动画(animate)简单引擎代码示例
2012/12/04 Javascript
jQuery中extend()和fn.extend()方法详解
2015/06/03 Javascript
JavaScript的Number对象的toString()方法
2015/12/18 Javascript
JavaScript学习笔记之取数组中最大值和最小值
2016/03/23 Javascript
bootstrap模态框消失问题的解决方法
2016/12/02 Javascript
JS编写函数实现对身份证号码最后一位的验证功能
2016/12/29 Javascript
详解vue2父组件传递props异步数据到子组件的问题
2017/06/29 Javascript
360提示[高危]使用存在漏洞的JQuery版本的解决方法
2017/10/27 jQuery
NodeJs项目中关闭ESLint的方法
2018/08/09 NodeJs
vue 优化CDN加速的方法示例
2018/09/19 Javascript
记录一次开发微信网页分享的步骤
2019/05/07 Javascript
layui自定义插件citySelect实现省市区三级联动选择
2019/07/26 Javascript
详解JWT token心得与使用实例
2019/08/02 Javascript
layui数据表格重载实现往后台传参
2019/11/15 Javascript
JavaScript canvas绘制圆弧与圆形
2020/02/18 Javascript
Python多线程编程(三):threading.Thread类的重要函数和方法
2015/04/05 Python
完美解决python遍历删除字典里值为空的元素报错问题
2016/09/11 Python
python 实现得到当前时间偏移day天后的日期方法
2018/12/31 Python
Python搭建代理IP池实现接口设置与整体调度
2019/10/27 Python
前端制作动画的几种方式(css3,js)
2016/12/12 HTML / CSS
英国探险旅游专家:Explore
2018/12/20 全球购物
俄罗斯在线水暖商店:Perfecto.ru
2019/10/25 全球购物
软件工程师面试题
2012/06/25 面试题
我的梦中国梦演讲稿
2014/04/23 职场文书
乡镇计划生育工作汇报
2014/10/28 职场文书
2014年安全员工作总结
2014/11/13 职场文书
2015年工商局个人工作总结
2015/07/23 职场文书
人事部:年度述职报告范文
2019/07/12 职场文书
Python 机器学习工具包SKlearn的安装与使用
2021/05/14 Python
一文搞懂Python Sklearn库使用
2021/08/23 Python
Python批量解压&压缩文件夹的示例代码
2022/04/04 Python
Python PIL按比例裁剪图片
2022/05/11 Python