浅谈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 参数列表中的self 显式不等于冗余
Dec 01 Python
linux系统使用python监控apache服务器进程脚本分享
Jan 15 Python
Python使用cx_Oracle调用Oracle存储过程的方法示例
Oct 07 Python
TensorFlow高效读取数据的方法示例
Feb 06 Python
Python实现的各种常见分布算法示例
Dec 13 Python
numpy数组广播的机制
Jul 12 Python
django 配置阿里云OSS存储media文件的例子
Aug 20 Python
Python字典的概念及常见应用实例详解
Oct 30 Python
Pytorch 实现数据集自定义读取
Jan 18 Python
Python class的继承方法代码实例
Feb 14 Python
Spring @Enable模块驱动原理及使用实例
Jun 23 Python
python通配符之glob模块的使用详解
Apr 24 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
利用static实现表格的颜色隔行显示
2006/10/09 PHP
php类中的各种拦截器用法分析
2014/11/03 PHP
JQuery CSS样式控制 学习笔记
2009/07/23 Javascript
jQuery实现的多选框多级联动插件
2014/05/02 Javascript
javascript数组操作方法小结和3个属性详细介绍
2014/07/05 Javascript
JS控制表格实现一条光线流动分割行的方法
2015/03/09 Javascript
js针对ip地址、子网掩码、网关的逻辑性判断
2016/01/06 Javascript
jQuery插件AjaxFileUpload实现ajax文件上传
2016/05/05 Javascript
JS使用正则表达式过滤多个词语并替换为相同长度星号的方法
2016/08/03 Javascript
使用JavaScript获取URL中的参数(两种方法)
2016/11/16 Javascript
详解JS: reduce方法实现 webpack多文件入口
2017/02/14 Javascript
分分钟玩转Vue.js组件(二)
2017/03/01 Javascript
修改 bootstrap table 默认detailRow样式的实例代码
2017/07/21 Javascript
vue-router实现组件间的跳转(参数传递)
2017/11/07 Javascript
vue实现模态框的通用写法推荐
2018/02/26 Javascript
JS代码检查工具ESLint介绍与使用方法
2020/02/04 Javascript
原生javascript如何实现共享onload事件
2020/07/03 Javascript
基于Pandas读取csv文件Error的总结
2018/06/15 Python
python 读取文本文件的行数据,文件.splitlines()的方法
2018/07/12 Python
关于python之字典的嵌套,递归调用方法
2019/01/21 Python
基于Python的微信机器人开发 微信登录和获取好友列表实现解析
2019/08/21 Python
Python内置加密模块用法解析
2019/11/25 Python
opencv-python的RGB与BGR互转方式
2020/06/02 Python
Matplotlib.pyplot 三维绘图的实现示例
2020/07/28 Python
Cpython解释器中的GIL全局解释器锁
2020/11/09 Python
拥有超过850家商店的美国在线派对商店:Party City
2018/10/21 全球购物
CheapTickets泰国:廉价航班,查看促销价格并预订机票
2019/12/28 全球购物
Vans(范斯)新西兰官方网站:美国原创极限运动品牌
2020/09/19 全球购物
在SQL Server中创建数据库主要有那种方式
2013/09/10 面试题
个人找工作的自我评价
2013/10/17 职场文书
初中新生军训方案
2014/05/13 职场文书
个人欠款协议书范本2014
2014/11/02 职场文书
鉴史问廉观后感
2015/06/10 职场文书
招商银行工作证明
2015/06/17 职场文书
CSS3实现模糊背景的三种效果示例
2021/03/30 HTML / CSS
MongoDB支持的数据类型
2022/04/11 MongoDB