单链表的代码python_python版本单链表实现代码

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

这一篇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()

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持聚米学院。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/559982.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python csv文件复制时的编码问题_使用python读取CSV文件时的编码问题

尝试使用python读取CSV文件时遇到障碍。更新&#xff1a;如果只想跳过字符或错误&#xff0c;可以打开文件&#xff0c;如下所示&#xff1a;with open(os.path.join(directory, file), r, encoding"utf-8", errors"ignore") as data_file:到目前为止&…

zabbix mysql脚本_zabbix监控mysql脚本

vim /usr/local/scripts/mysql_status.sh#!/bin/bash#Desc&#xff1a;zabbix 监控 MySQL 状态#Date&#xff1a;2020-09-05#by&#xff1a;Luojq#主机HOST"localhost"#用户USER"root"#密码PASSWORD"123456"#端口PORT"3306"#MySQL连接…

java rsa算法_求RSA算法JAVA实现源代码(带界面的)

展开全部import javax.crypto.Cipher;import java.security.*;import java.security.spec.RSAPublicKeySpec;import java.security.spec.RSAPrivateKeySpec;import java.security.spec.InvalidKeySpecException;import java.security.interfaces.RSAPrivateKey;import java.sec…

redis事务java_java 使用RedisTemplate实现Redis事务

关系型数据库事务的作用是保证并发访问下数据的一致性&#xff0c;Redis事务有些不同&#xff0c;由于Redis是单线程的处理来自client的指令&#xff0c;所以Redis所有命令的执行都是原子性的&#xff0c;举一个简单的例子&#xff0c;单个Redis服务器下&#xff0c;并发地执行…

java string值传递_String是值传递还是引用传递

string中的坑最近看到一道关于string的面试题&#xff0c;差点让我以为string是值传递&#xff0c;就是下面这个例子&#xff0c;体验下&#xff1a;public class demo{public static void main(string[] args) {demo d new demo();string str "bea";d.change(str)…

java切换jdk版本_切换JDK版本quick

最近遇到一个小问题&#xff0c;同时做两个项目&#xff0c;jdk版本一个是5&#xff0c;一个是6&#xff0c;我也去网上找了找方法&#xff0c;但是感觉不是特别好用&#xff0c;最后自己通过一些环境变量设置的技巧和一些批处理命令来使得这件事情只需要双击&#xff0c;输入一…

java读取excel数据的方法是_java怎么读取excel文件里的数据

展开全部下面是一个简单的读取例子&#xff0c;如果报“java.io.IOException: Invalid header signature; read 4503608217567241, expected -2226271756974174256”之类的异常请用Excel打开(如果能打的开的话)62616964757a686964616fe58685e5aeb931333361323639然后另存为一下…

Linux下导出MySQL为SQL文件_MySQL导入导出.sql文件步骤

MySQL导入导出.sql文件步骤如下&#xff1a;一.MySQL的命令行模式的设置&#xff1a;桌面->我的电脑->属性->环境变量->新建->PATH“&#xff1b;path\mysql\bin;”其中path为MySQL的安装路径。二.简单的介绍一下命令行进入MySQL的方法&#xff1a;1.C:\>mys…

python sort 多级排序_Python使用sort和class实现的多级排序功能示例

本文实例讲述了Python使用sort和class实现的多级排序功能。分享给大家供大家参考&#xff0c;具体如下&#xff1a;# -*- coding:utf-8 -*-import randomclass Temp:def __init__(self, a, b, c):self.a aself.b bself.c cdef __str__(self):return ( ([a: %d b: %d c: %d] …

the java home_the java_home environment variable is not defined correctly

在启动tomcat中的startup.bat时&#xff0c;总是报以下错误the java_home environment variable is not defined correctlyThis environment variable is needed to run this programNB: java_home should point to a jdk not a jre环境变量的路径没有问题&#xff0c;把jdk重装…

java中添加背景_java中如何增加背景图片

我的程序代码如下&#xff0c;试了加背景的方法虽然程序没有错误&#xff0c;但是背景还是显示不出来&#xff0c;按钮的setsize好像也不起作用&#xff0c;希望高人能助一臂之力&#xff0c;小女子先写过各位了&#xff1a;、、、、importjava.awt....我的程序代码如下&#x…

java存钱_用Java编写银行存钱取钱

const readline require(readline-sync)//引用readline-synclet s 2;//错误的次数for (let i 0; i < 3; i) {console.log(请输入名&#xff1a;(由英文组成));let user readline.question();console.log(请输入密码&#xff1a;(由数字组成));let password readline.qu…

我的世界java服务器刷_一个教程, 叫你如何在服务器刷op

教 你 如 何 在 服 务 器 内 刷 取op~&#xff01;首先打开JAVA文件夹找到bin\client 里面的Xusage然后打开然后会得到这个内容-Xmixed mixed mode execution (default)-Xint interpreted mode execution only-Xbootclasspath:set search path for boots…

mysql 小雨_Mysql数据库

Mysql服务配置安装mysqld服务&#xff1a;yum groupinstall ‘mysql database server’yum –y install mysql-server php-mysql服务名&#xff1a; mysqld默认的数据库存放在&#xff1a; /var/lib/mysql下启动服务&#xff1a; service mysqld restart可以直接登陆&#xff1…

java eav_动态自定义字段属性–Magento的EAV模型 | 学步园

EAV &#xff1a; Entity - Attribute - Value 的缩写&#xff0c;是数据库模型的一种&#xff0c;使用eav建模的好处是可以动态为数据模型增加或移除属性。1. 问题提出:假设需要定义一个实体Customer的信息&#xff0c;通常我们只要定义一个表为customer&#xff0c;并定义相应…

java 对象视图框架_Stripes视图框架Java对象属性验证和prototype.js Ajax的测试

Stripes视图框架Java对象属性验证&#xff0c;它允许对字段设置是否必须填写&#xff0c;对数字大小进行限制等。我用prototype.js Ajax 将验证后的数据及时地展示出来&#xff0c;下面来看程序。1、编写User实体类此用户共三个属性&#xff1a; name、email、age.package com.…

java中unicode显示乱码_Java 已知Java系统编码是GBK,jtextarea从一编码为Unicode的文本中读取数据,出现乱码,怎么正常显示?...

Java 已知Java系统编码是GBK&#xff0c;jtextarea从一编码为Unicode的文本中读取数据&#xff0c;出现乱码&#xff0c;怎么正常显示&#xff1f;关注:159 答案:2 mip版解决时间 2021-02-03 12:45提问者鉨瞞着所囿亾&#xff0c;爱着誰2021-02-02 16:35我觉得jtextarea中读取…

java中按钮的接口_Java接口基础

接口(interface)1.接口体中包含常量的声明(没有变量)和抽象方法两部分。接口体中只有抽象方法&#xff0c;没有普通的方法&#xff0c;而且接口体中所有的常量访问权限一定是public&#xff0c;而且是static常量(允许省略public、final和static修饰符)&#xff0c;所有的抽象方…

python之if经典语句_Python之if语句、字典

if语句1>利用if语句判断用户是否被禁言banned_users.pybanned_users[Lily,jonh,Susan]userLilyif user not in baned_users:print(user.title()",you can post a response if you wish.")######2>if else 语句age17if age>18:print("You are old enoug…

java 线程加载类_java JVM-线程上下类加载器

public class One {public static void main(String[] args) throws Exception {ClassLoader loaderOne.class.getClassLoader();System.out.println(loader);//获得当前线程的上下文加载器&#xff0c;未改变前和第一种是一样的ClassLoader loader2Thread.currentThread().get…