python版本单链表实现代码


Posted in Python onSeptember 28, 2018

今天看了一下数据结构的书,发现其实数据结构没有几种,线性表,数组,字符串,队列和栈,等等,其实是一回事,然后就是树结构,图结构。数据结构的理论并不难,主要是要自己写一下这些数据结构以及对应的基本的操作方法,这样就能够更快的提高。

这一篇blog写一下线性表。

线性表:分为顺序表和链表

一、顺序表

顺序表就是相对于表中的数据,地址也是顺序的,所以可以随机存取。但是在操作插入和删除元素的时候,由于要满足地址的连续性,所以要移动很多的元素位置,因此,插入或者删除一个顺序表的元素的时间复杂度是o(n)。很多时候,在对顺序表做合并的时候,需要先对表中的元素进行排序,然后再进行处理,这样可以避免每次都从头进行查询。

二、链表

链表就失去了顺序表的随机存取特点,即每次从中取一个元素都要从头开始找,这样耗费了一些时间,时间复杂度为o(n);但是在做插入和删除,以及两个链表合并的时候,就方便了很多,只需要做一点指针修改就可以了。

链表中的每一个元素节点都包含了数据部分和下一个节点的指针。一般在链表的头部附设一个头结点,而且头结点一般不存储数据,而是存放一些长度等附加信息,或者不存储。

在很多语言中没有指针这一概念,而有数组的概念,比如java和python,java中的数组还要求定义数组的类型,也就是说必须都是同一类型的数据,而python则没有要求,所以python的list更贴近链表的真正含义。这种用数组描述的链表叫做静态链表。使用静态链表来描述链表对此类语言要方便很多了,本身这些语言都提供了内置类来处理链表。

除此之外,还有循环链表,双向链表(解决了无法向前搜索的问题,但是在修改指针的时候需要有更多的操作)。

# -*- coding=utf-8 -*-
# 这个例子是Python版本的单链表

class Node(object):
  def __init__(self, value, next=0):
    self.value = value
    self.next = next # 指针


class LinkedList(object):
  # 链表的数据结构
  def __init__(self):
    self.head = 0 # 头部

  def __getitem__(self, key):
    if self.is_empty():
      print 'Linked list is empty.'
      return
    elif key < 0 or key > self.get_length():
      print 'The given key is wrong.'
      return
    else:
      return self.get_elem(key)

  def __setitem__(self, key, value):
    if self.is_empty():
      print 'Linked list is empty.'
      return
    elif key < 0 or key > self.get_length():
      print 'The given key is wrong.'
      return
    else:
      return self.set_elem(key, value)

  def init_list(self, data): # 按列表给出 data
    self.head = Node(data[0])
    p = self.head # 指针指向头结点
    print p, self.head
    for i in data[1:]:
      p.next = Node(i) # 确定指针指向下一个结点
      p = p.next # 指针滑动向下一个位置
    print self.head.next.next

  def get_length(self):
    length = 0
    p = self.head
    while p != 0: # 0 值就是Node结点中默认的 0 值,表示下一个结点没有了,即没有为其赋值
      length += 1
      p = p.next
    return length

  def is_empty(self):
    if self.head == 0:
      return True
    else:
      return False

  def insert_node(self, index, value):
    if index < 0 or index > self.get_length():
      print 'Can not insert node into the linked list.'
    elif index == 0:
      temp = self.head
      self.head = Node(value, temp)
    else:
      p, post = self.head, self.head
      for i in xrange(index):
        post = p
        p = p.next
      temp = p
      post.next = Node(value, temp)

  def delete_node(self, index):
    if index < 0 or index > self.get_length()-1:
      print "Wrong index number to delete any node."
    elif self.is_empty():
      print "No node can be deleted."
    elif index == 0:
      temp = self.head
      self.head = temp.next
    elif index == self.get_length():
      p = self.head
      for i in xrange(self.get_length()-2):
        p = p.next
      p.next = 0
    else:
      p = self.head
      for i in xrange(index-1):
        p = p.next
      p.next = p.next.next

  def show_linked_list(self): # 打印链表中的所有元素
    if self.is_empty():
      print 'This is an empty linked list.'
    else:
      p, container = self.head, []
      for _ in xrange(self.get_length()-1):
        container.append(p.value)
        p = p.next
      container.append(p.value)
      print container

  def clear_linked_list(self): # 将链表置空
    self.head = 0

  def get_elem(self, index):
    if self.is_empty():
      print "The linked list is empty. Can not get element."
    elif index < 0 or index > self.get_length()-1:
      print "Wrong index number to get any element."
    else:
      p = self.head
      for _ in xrange(index):
        p = p.next
      return p.value

  def set_elem(self, index, value):
    if self.is_empty():
      print "The linked list is empty. Can not set element."
    elif index < 0 or index > self.get_length()-1:
      print "Wrong index number to set element."
    else:
      p = self.head
      for _ in xrange(index):
        p = p.next
      p.value = value

  def get_index(self, value):
    p = self.head
    for i in xrange(self.get_length()):
      if p.value == value:
        return i
      else:
        p = p.next
    return -1


l = LinkedList()
print "The length of linked list now is: ", l.get_length()
print l.is_empty()
l.init_list([1, 5, 12, "fjd", 45, 999])
print "The length of linked list now is: ", l.get_length()
print l.is_empty()
l.insert_node(4, 100)
l.insert_node(6, "cecil")
l.show_linked_list()
print "The value of index 0 is: ", l.get_elem(0)
l.set_elem(0,1000)
l.show_linked_list()
print "the index of *** is: ", l.get_index(1009)
print "The length of linked list now is: ", l.get_length()
l.delete_node(3)
#l.clear_linked_list()
l.show_linked_list()

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python根据文件大小打log日志
Oct 09 Python
Python的ORM框架中SQLAlchemy库的查询操作的教程
Apr 25 Python
Python中shutil模块的学习笔记教程
Apr 04 Python
Python 中pandas.read_excel详细介绍
Jun 23 Python
python音频处理用到的操作的示例代码
Oct 27 Python
ZABBIX3.2使用python脚本实现监控报表的方法
Jul 02 Python
Python多版本开发环境管理工具介绍
Jul 03 Python
Python获取好友地区分布及好友性别分布情况代码详解
Jul 10 Python
详解Python 字符串相似性的几种度量方法
Aug 29 Python
将tensorflow.Variable中的某些元素取出组成一个新的矩阵示例
Jan 04 Python
Python reduce函数作用及实例解析
May 08 Python
解决python cv2.imread 读取中文路径的图片返回为None的问题
Jun 02 Python
python实现反转部分单向链表
Sep 27 #Python
python八皇后问题的解决方法
Sep 27 #Python
python判断数字是否是超级素数幂
Sep 27 #Python
Flask实现跨域请求的处理方法
Sep 27 #Python
python环形单链表的约瑟夫问题详解
Sep 27 #Python
transform python环境快速配置方法
Sep 27 #Python
python如何求解两数的最大公约数
Sep 27 #Python
You might like
咖啡知识大全
2021/03/03 新手入门
thinkphp中空模板与空模块的用法实例
2014/11/26 PHP
javascript getElementsByTagName
2011/01/31 Javascript
JavaScript中的私有/静态属性介绍
2012/07/26 Javascript
jquery win 7透明弹出层效果的简单代码
2013/08/06 Javascript
浅析Js中的单引号与双引号问题
2013/11/06 Javascript
javascript中with()方法的语法格式及使用
2014/08/04 Javascript
jQuery遍历对象、数组、集合实例
2014/11/08 Javascript
AngularJS实现全选反选功能
2015/12/08 Javascript
jQuery Mobile开发中日期插件Mobiscroll使用说明
2016/03/02 Javascript
javascript常见数字进制转换实例分析
2016/04/21 Javascript
iScroll.js 使用方法参考
2016/05/16 Javascript
Webpack常见静态资源处理-模块加载器(Loaders)+ExtractTextPlugin插件
2017/06/29 Javascript
微信小程序实现横向增长表格的方法
2018/07/24 Javascript
jQuery中$原理实例分析
2018/08/13 jQuery
详解关闭令人抓狂的ESlint 语法检测配置方法
2019/10/28 Javascript
vue 实现用户登录方式的切换功能
2020/04/14 Javascript
vue实现简单全选和反选功能
2020/09/15 Javascript
[07:55]2014DOTA2 TI正赛第三日 VG上演推进荣耀DKEG告别
2014/07/21 DOTA
[45:44]完美世界DOTA2联赛PWL S2 FTD vs PXG 第一场 11.27
2020/12/01 DOTA
使用Python的Tornado框架实现一个一对一聊天的程序
2015/04/25 Python
Python编程对列表中字典元素进行排序的方法详解
2017/05/26 Python
Python2.7基于笛卡尔积算法实现N个数组的排列组合运算示例
2017/11/23 Python
Selenium 模拟浏览器动态加载页面的实现方法
2018/05/16 Python
Python实现提取XML内容并保存到Excel中的方法
2018/09/01 Python
对python Tkinter Text的用法详解
2018/10/11 Python
Python企业编码生成系统之系统主要函数设计详解
2019/07/26 Python
Python 使用threading+Queue实现线程池示例
2019/12/21 Python
python3.x中安装web.py步骤方法
2020/06/23 Python
HTML5+CSS3 实现灵动的动画 TAB 切换效果(DEMO)
2017/09/15 HTML / CSS
美国最大的团购网站:Groupon
2016/07/23 全球购物
Mankind美国/加拿大:英国领先的男士美容护发用品公司
2018/12/05 全球购物
小学数学教学反思
2014/02/02 职场文书
运动会三级跳加油稿
2015/07/21 职场文书
婚宴父亲致辞
2015/07/27 职场文书
Mysql数据库索引面试题(程序员基础技能)
2021/05/31 MySQL