浅谈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通过pil模块将raw图片转换成png图片的方法
Mar 16 Python
Python使用django获取用户IP地址的方法
May 11 Python
Python之日期与时间处理模块(date和datetime)
Feb 16 Python
Python 多线程Threading初学教程
Aug 22 Python
python中hashlib模块用法示例
Oct 30 Python
Python Json序列化与反序列化的示例
Jan 31 Python
python如何实现反向迭代
Mar 20 Python
Python实现基于POS算法的区块链
Aug 07 Python
Spring Cloud Feign高级应用实例详解
Dec 10 Python
python3 re返回形式总结
Nov 20 Python
Python中request的基本使用解决乱码问题
Apr 12 Python
Sentry的安装、配置、使用教程(Sentry日志手机系统)
Jul 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
php5.3不能连接mssql数据库的解决方法
2014/12/27 PHP
PHP 数组基本操作小结(推荐)
2016/06/13 PHP
php中使用websocket详解
2016/09/23 PHP
PHP数组遍历的几种常见方式总结
2019/02/15 PHP
PHP 结合 Boostrap 结合 js 实现学生列表删除编辑及搜索功能
2019/05/21 PHP
网页常用特效代码整理
2006/06/23 Javascript
从阿里妈妈发现的几个不错的表单验证函数
2007/09/21 Javascript
为什么Node.js会这么火呢?Node.js流行的原因
2014/12/01 Javascript
浅谈重写window对象的方法
2014/12/29 Javascript
window.open()实现post传递参数
2015/03/12 Javascript
javascript性能优化之事件委托实例详解
2015/12/12 Javascript
Vue.js路由vue-router使用方法详解
2017/03/20 Javascript
vue引用js文件的多种方式(推荐)
2018/05/17 Javascript
Vue项目History模式404问题解决方法
2018/10/31 Javascript
js防抖和节流的深入讲解
2018/12/06 Javascript
vue项目使用$router.go(-1)返回时刷新原来的界面操作
2020/07/26 Javascript
Vue通过provide inject实现组件通信
2020/09/03 Javascript
Python中使用Tkinter模块创建GUI程序实例
2015/01/14 Python
Python sqlite3事务处理方法实例分析
2017/06/19 Python
Python实现的递归神经网络简单示例
2017/08/11 Python
python3+PyQt5使用数据库表视图
2018/04/24 Python
python实现的多任务版udp聊天器功能案例
2019/11/13 Python
浅谈pycharm导入pandas包遇到的问题及解决
2020/06/01 Python
Opencv求取连通区域重心实例
2020/06/04 Python
keras Lambda自定义层实现数据的切片方式,Lambda传参数
2020/06/11 Python
详解canvas多边形(蜘蛛图)的画法示例
2018/01/29 HTML / CSS
在C++ 程序中调用被C 编译器编译后的函数,为什么要加extern "C"
2014/08/09 面试题
少年闰土教学反思
2014/02/22 职场文书
行政人事岗位职责
2014/03/17 职场文书
入职担保书怎么写
2014/05/12 职场文书
公司运动会策划方案
2014/05/25 职场文书
护士求职信
2014/07/05 职场文书
校园运动会广播稿
2014/10/06 职场文书
论文答谢词
2015/01/20 职场文书
安全伴我行主题班会
2015/08/13 职场文书
Ruby序列化和持久化存储 Marshal和Pstore介绍
2022/04/18 Ruby