浅谈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中的迭代器、生成器与列表解析用法
Mar 20 Python
Python中Django 后台自定义表单控件
Mar 28 Python
Python中函数的基本定义与调用及内置函数详解
May 13 Python
python pandas写入excel文件的方法示例
Jun 25 Python
django和vue实现数据交互的方法
Aug 21 Python
python协程gevent案例 爬取斗鱼图片过程解析
Aug 27 Python
python关闭占用端口方式
Dec 17 Python
信号生成及DFT的python实现方式
Feb 25 Python
Python使用进程Process模块管理资源
Mar 05 Python
协程Python 中实现多任务耗资源最小的方式
Oct 19 Python
python中的None与NULL用法说明
May 25 Python
golang特有程序结构入门教程
Jun 02 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新手上路(十二)
2006/10/09 PHP
php实现图片添加描边字和马赛克的方法
2014/12/10 PHP
php遍历类中包含的所有元素的方法
2015/05/12 PHP
php实现分页功能的详细实例方法
2019/09/29 PHP
jQuery 事件队列调整方法
2009/09/18 Javascript
jQuery参数列表集合
2011/04/06 Javascript
javascript间隔定时器(延时定时器)学习 间隔调用和延时调用
2014/01/13 Javascript
javascript中兼容主流浏览器的动态生成iframe方法
2014/05/05 Javascript
angular.foreach 循环方法使用指南
2015/01/06 Javascript
javascript操作Cookie(设置、读取、删除)方法详解
2015/03/18 Javascript
javascript中错误使用var造成undefined
2016/03/31 Javascript
基于Vue如何封装分页组件
2016/12/16 Javascript
scroll事件实现监控滚动条并分页显示(zepto.js)
2016/12/18 Javascript
react.js 翻页插件实例代码
2017/01/19 Javascript
js 客户端打印html 并且去掉页眉、页脚的实例
2017/11/03 Javascript
微信小程序页面跳转功能之从列表的item项跳转到下一个页面的方法
2017/11/27 Javascript
解析Vue 2.5的Diff算法
2017/11/28 Javascript
nodejs 简单实现动态html的方法
2018/05/12 NodeJs
vue指令只能输入正数并且只能输入一个小数点的方法
2018/06/08 Javascript
TypeScript中的方法重载详解
2019/04/12 Javascript
基于JS实现web端录音与播放功能
2019/04/17 Javascript
[34:41]夜魇凡尔赛茶话会 第二期02:你画我猜
2021/03/11 DOTA
python的re模块应用实例
2014/09/26 Python
对PyTorch torch.stack的实例讲解
2018/07/30 Python
浅析Python函数式编程
2018/10/06 Python
pytorch绘制并显示loss曲线和acc曲线,LeNet5识别图像准确率
2020/01/02 Python
pip已经安装好第三方库但pycharm中import时还是标红的解决方案
2020/10/09 Python
css3学习心得分享
2013/08/19 HTML / CSS
HTML5在a标签内放置块级元素示例代码
2013/08/23 HTML / CSS
三陽商会官方网站:Sanyo iStore
2019/05/15 全球购物
社区工作者思想汇报
2014/01/13 职场文书
有兼职工作经历的简历自我评价
2014/03/07 职场文书
三八节主持词
2014/03/17 职场文书
光荣之路观后感
2015/06/12 职场文书
详解Apache SkyWalking 告警配置指南
2021/04/22 Servers
Win11如何设置右键单击显示所有选项?Win11右键单击显示所有选项设置教程
2022/04/08 数码科技