浅谈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 相关文章推荐
Linux环境下MySQL-python安装过程分享
Feb 02 Python
Python while、for、生成器、列表推导等语句的执行效率测试
Jun 03 Python
Python获取邮件地址的方法
Jul 10 Python
pip安装Python库时遇到的问题及解决方法
Nov 23 Python
利用Python yagmail三行代码实现发送邮件
May 11 Python
python调用tcpdump抓包过滤的方法
Jul 18 Python
详解python分布式进程
Oct 08 Python
python 定义n个变量方法 (变量声明自动化)
Nov 10 Python
Python使用pyshp库读取shapefile信息的方法
Dec 29 Python
Python数据可视化:顶级绘图库plotly详解
Dec 07 Python
Windows下Pycharm远程连接虚拟机中Centos下的Python环境(图文教程详解)
Mar 19 Python
python3 logging日志封装实例
Apr 08 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
Discuz!下Memcache缓存实现方法
2010/05/28 PHP
2个比较经典的PHP加密解密函数分享
2014/07/01 PHP
php中出现空白页的原因及解决方法汇总
2014/07/08 PHP
PHP判断密码强度的方法详解
2017/05/26 PHP
Mootools 1.2教程(2) DOM选择器
2009/09/14 Javascript
js实现图片轮换效果代码
2013/04/16 Javascript
JavaScript如何从listbox里同时删除多个项目
2013/10/12 Javascript
jQuery学习笔记之总体架构
2014/06/03 Javascript
JavaScript实现N皇后问题算法谜题解答
2014/12/29 Javascript
js实现同一页面可多次调用的图片幻灯切换效果
2015/02/28 Javascript
JQuery+CSS实现图片上放置按钮的方法
2015/05/29 Javascript
Bootstrap每天必学之导航条
2015/11/27 Javascript
Javascript中prototype的使用详解
2016/06/18 Javascript
Bootstrap字体图标无法正常显示的解决方法
2016/10/08 Javascript
详解Angular路由 ng-route和ui-router的区别
2017/05/22 Javascript
浅谈关于.vue文件中style的scoped属性
2017/08/19 Javascript
Web技术实现移动监测的介绍
2017/09/18 Javascript
使用 vue.js 构建大型单页应用
2018/02/10 Javascript
JS求Number类型数组中最大元素方法
2018/04/08 Javascript
vue awesome swiper异步加载数据出现的bug问题
2018/07/03 Javascript
小程序开发基础之view视图容器
2018/08/21 Javascript
浅谈js闭包理解
2019/03/28 Javascript
微信小程序BindTap快速连续点击目标页面跳转多次问题处理
2019/04/08 Javascript
基于vue实现滚动条滚动到指定位置对应位置数字进行tween特效
2019/04/18 Javascript
小程序api实现promise封装过程解析
2019/11/21 Javascript
JavaScript实现轮播图效果
2020/10/30 Javascript
Python下的subprocess模块的入门指引
2015/04/16 Python
详解pandas删除缺失数据(pd.dropna()方法)
2019/06/25 Python
Django对models里的objects的使用详解
2019/08/17 Python
Python简单实现区域生长方式
2020/01/16 Python
10个python3常用排序算法详细说明与实例(快速排序,冒泡排序,桶排序,基数排序,堆排序,希尔排序,归并排序,计数排序)
2020/03/17 Python
AVI-8手表美国官方商店:AVI-8 USA
2019/04/10 全球购物
美国家庭鞋店:Shoe Sensation
2019/09/27 全球购物
学校党的群众路线教育实践活动整改措施
2014/10/25 职场文书
钢琴师观后感
2015/06/12 职场文书
《活见鬼》教学反思
2016/02/24 职场文书