浅谈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中return语句用法实例分析
Aug 04 Python
Python中遍历字典过程中更改元素导致异常的解决方法
May 12 Python
详解Python中的from..import绝对导入语句
Jun 21 Python
查看django执行的sql语句及消耗时间的两种方法
May 29 Python
对python 数据处理中的LabelEncoder 和 OneHotEncoder详解
Jul 11 Python
Python使用requests提交HTTP表单的方法
Dec 26 Python
在tensorflow中设置保存checkpoint的最大数量实例
Jan 21 Python
PyCharm无法识别PyQt5的2种解决方法,ModuleNotFoundError: No module named 'pyqt5'
Feb 17 Python
利用pandas向一个csv文件追加写入数据的实现示例
Apr 23 Python
Python3自定义http/https请求拦截mitmproxy脚本实例
May 11 Python
python如何实时获取tcpdump输出
Sep 16 Python
python+selenium自动化实战携带cookies模拟登陆微博
Jan 19 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
不用数据库的多用户文件自由上传投票系统(3)
2006/10/09 PHP
php设计模式 Adapter(适配器模式)
2011/06/26 PHP
去除php注释和去除空格函数分享
2014/03/13 PHP
PHP处理会话函数大总结
2015/08/05 PHP
php中序列化与反序列化详解
2017/02/13 PHP
thinkPHP5框架auth权限控制类与用法示例
2018/06/12 PHP
详解Laravel5.6 Passport实现Api接口认证
2018/07/27 PHP
php传值和传引用的区别点总结
2019/11/19 PHP
javascript 一个自定义长度的文本自动换行的函数
2007/08/19 Javascript
根据一段代码浅谈Javascript闭包
2010/12/14 Javascript
js 动态文字滚动的例子
2011/01/17 Javascript
js左右弹性滚动对联广告代码分享
2014/02/19 Javascript
js实现文字跟随鼠标移动而移动的方法
2015/02/28 Javascript
Nodejs关于gzip/deflate压缩详解
2015/03/04 NodeJs
JQuery中DOM事件合成用法实例分析
2015/06/13 Javascript
Grunt入门教程(自动任务运行器)
2015/08/06 Javascript
JS+CSS实现的蓝色table选项卡效果
2015/10/08 Javascript
使用JS中的exec()方法构造正则表达式验证
2016/08/01 Javascript
浅谈js中对象的使用
2016/08/11 Javascript
webpack常用配置项配置文件介绍
2016/11/07 Javascript
jQuery实现checkbox列表的全选、反选功能
2016/11/24 Javascript
JavaScript实现大图轮播效果
2017/01/11 Javascript
Angularjs单选框相关的示例代码
2017/08/17 Javascript
jquery ajax异步提交表单数据的方法
2017/10/27 jQuery
JavaScript对象属性操作实例解析
2020/02/04 Javascript
ReactRouter的实现方法
2021/01/25 Javascript
python之import机制详解
2014/07/03 Python
python制作websocket服务器实例分享
2016/11/20 Python
Python 正则表达式实现计算器功能
2017/04/29 Python
python pandas dataframe 按列或者按行合并的方法
2018/04/12 Python
python encrypt 实现AES加密的实例详解
2020/02/20 Python
CSS3的Border-radius轻松制作圆角
2012/12/24 HTML / CSS
Glamest意大利:女性在线奢侈品零售店
2019/04/28 全球购物
2015年小学开学寄语
2015/02/27 职场文书
python基础之停用词过滤详解
2021/04/21 Python
解决pytorch 损失函数中输入输出不匹配的问题
2021/06/05 Python