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实现从百度API获取天气的方法
Mar 11 Python
python爬取各类文档方法归类汇总
Mar 22 Python
python+selenium 定位到元素,无法点击的解决方法
Jan 30 Python
深入理解Python异常处理的哲学
Feb 01 Python
djang常用查询SQL语句的使用代码
Feb 15 Python
解决pytorch DataLoader num_workers出现的问题
Jan 14 Python
python实现音乐播放和下载小程序功能
Apr 26 Python
利用Python实现Excel的文件间的数据匹配功能
Jun 16 Python
Spring @Enable模块驱动原理及使用实例
Jun 23 Python
详解Python直接赋值,深拷贝和浅拷贝
Jul 09 Python
如何用Python编写一个电子考勤系统
Feb 08 Python
python实现批量提取指定文件夹下同类型文件
Apr 05 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
PHP结合jQuery实现找回密码
2015/07/22 PHP
thinkPHP简单遍历数组方法分析
2016/05/16 PHP
php mysql_list_dbs()函数用法示例
2017/03/29 PHP
Yii框架组件的事件机制原理与用法分析
2020/04/07 PHP
php解析非标准json、非规范json的方式实例
2020/12/10 PHP
Javascript仿PHP $_GET获取URL中的参数
2014/05/12 Javascript
jQuery实现定时读取分析xml文件的方法
2015/07/16 Javascript
JS实现浏览器状态栏显示时间的方法
2015/10/27 Javascript
jQuery+Ajax实现无刷新操作
2016/01/04 Javascript
关于backbone url请求中参数带有中文存入数据库是乱码的快速解决办法
2016/06/13 Javascript
Jquery获取当前城市的天气信息
2016/08/05 Javascript
通过原生JS实现为元素添加事件的方法
2016/11/23 Javascript
微信小程序完美解决scroll-view高度自适应问题的方法
2020/08/08 Javascript
用Python制作简单的钢琴程序的教程
2015/04/01 Python
Python中函数的参数传递与可变长参数介绍
2015/06/30 Python
Python使用回溯法子集树模板获取最长公共子序列(LCS)的方法
2017/09/08 Python
浅析Python 中几种字符串格式化方法及其比较
2019/07/02 Python
Python Django简单实现session登录注销过程详解
2019/08/06 Python
使用Python对Dicom文件进行读取与写入的实现
2020/04/20 Python
Python 如何实现数据库表结构同步
2020/09/29 Python
发现两个有趣的CSS3动画效果
2013/08/14 HTML / CSS
html5视频播放_动力节点Java学院整理
2017/07/13 HTML / CSS
HTML最新标准HTML5总结(必看)
2016/06/13 HTML / CSS
英国潮流网站:END.(全球免邮)
2017/01/16 全球购物
Johnson Fitness澳大利亚:高级健身器材
2021/03/16 全球购物
盛大二次面试题
2016/11/18 面试题
浙大毕业生自荐信
2014/01/26 职场文书
党支部书记岗位责任制
2014/02/11 职场文书
学校安全防火方案
2014/06/07 职场文书
公司活动总结怎么写
2014/06/25 职场文书
小学生光盘行动倡议书
2015/04/28 职场文书
推销搭讪开场白
2015/05/28 职场文书
毕业设计答辩开场白
2015/05/29 职场文书
离开雷锋的日子观后感
2015/06/09 职场文书
MySQL 全文索引使用指南
2021/05/25 MySQL
html输入两个数实现加减乘除功能
2021/07/01 HTML / CSS