浅谈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 urlopen 使用小示例
Sep 06 Python
python使用ctypes模块调用windowsapi获取系统版本示例
Apr 17 Python
Python实现的几个常用排序算法实例
Jun 16 Python
Python实现提取文章摘要的方法
Apr 21 Python
Python把csv数据写入list和字典类型的变量脚本方法
Jun 15 Python
Python实现购物评论文本情感分析操作【基于中文文本挖掘库snownlp】
Aug 07 Python
Python变量、数据类型、数据类型转换相关函数用法实例详解
Jan 09 Python
django 文件上传功能的相关实例代码(简单易懂)
Jan 22 Python
python如何调用php文件中的函数详解
Dec 29 Python
Pandas自定义选项option设置
Jul 25 Python
Python 正则模块详情
Nov 02 Python
python百行代码实现汉服圈图片爬取
Nov 23 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
咖啡界又出新概念,无需咖啡豆的分子咖啡
2021/03/03 咖啡文化
PHP中运用jQuery的Ajax跨域调用实现代码
2012/02/21 PHP
javascript获取元素CSS样式代码示例
2013/11/28 Javascript
关于js内存泄露的一个好例子
2013/12/09 Javascript
JS在IE下缺少标识符的错误
2014/07/23 Javascript
浅析Nodejs npm常用命令
2016/06/14 NodeJs
基于bootstrap风格的弹框插件
2016/12/28 Javascript
bootstrap 模态框(modal)实现水平垂直居中显示
2017/01/23 Javascript
javascript 的变量、作用域和内存问题
2017/04/19 Javascript
从对象列表中获取一个对象的方法,依据关键字和值
2017/09/20 Javascript
Angularjs过滤器实现动态搜索与排序功能示例
2017/12/13 Javascript
实例解析ES6 Proxy使用场景介绍
2018/01/08 Javascript
JavaScript实现多叉树的递归遍历和非递归遍历算法操作示例
2018/02/08 Javascript
JSON数据中存在单个转义字符“\”的处理方法
2018/07/11 Javascript
浅谈Vue.js组件(二)
2019/04/09 Javascript
详解将微信小程序接口Promise化并使用async函数
2019/08/05 Javascript
Vue项目环境搭建详细总结
2019/09/26 Javascript
Angular value与ngValue区别详解
2019/11/27 Javascript
JavaScript实现放大镜效果代码示例
2020/04/29 Javascript
Python的词法分析与语法分析
2013/05/18 Python
Python自定义函数的创建、调用和函数的参数详解
2014/03/11 Python
Python的批量远程管理和部署工具Fabric用法实例
2015/01/23 Python
Python解析最简单的验证码
2016/01/07 Python
tf.truncated_normal与tf.random_normal的详细用法
2018/03/05 Python
对Python通过pypyodbc访问Access数据库的方法详解
2018/10/27 Python
Django中的forms组件实例详解
2018/11/08 Python
Python3.5内置模块之shelve模块、xml模块、configparser模块、hashlib、hmac模块用法分析
2019/04/27 Python
浅谈python 中的 type(), dtype(), astype()的区别
2020/04/09 Python
THE OUTNET美国官网:国际设计师品牌折扣网站
2017/03/07 全球购物
医学生自我鉴定范文
2013/11/08 职场文书
总裁秘书岗位职责
2013/12/04 职场文书
技能比武方案
2014/05/21 职场文书
药剂专业自荐书
2014/06/20 职场文书
股权转让协议书
2014/12/07 职场文书
2015年助理工程师工作总结
2015/04/03 职场文书
MySQL性能压力基准测试工具sysbench的使用简介
2021/04/21 MySQL