链表是一种数据结构,链表在循环遍历的时候效率不高,但是在插入和删除时优势比较大。
链表由一个个节点组成。
单向链表的节点分为两个部分:存储的对象和对下一个节点的引用。注意是指向下一个节点。
而双向链表区别于单向链表的是它是由三个部分组成:存储的对象、对下一个节点的引用、对上一个节点的引用,可以实现双向遍历。
单向列表的结构如下图:
head是头节点,tail是尾节点,每个节点由Data存储对象和Next对下一个节点引用组成
下面说一下单向链表插入和删除的过程。
插入一个新节点:
原理:前一个节点的Next指向当前新节点,新节点的Next指向要插入节点位置的后一个节点。
注意:在实际应用时需要考虑插入位置是头结点和尾节点的情况。
 
删除一个节点:
原理:找到要删除节点的上一个节点,直接上一个节点的Next指向删除位置的下一个节点。
注意:在实际应用中需要考虑到删除的节点是否是头节点或尾节点,需要考虑到链表的长度。
 
下面附上一个用python写的单链表的例子。
 
class Node:
next = None
data = None
def __init__(self,nodeData):
self.data = nodeData class List:
head = None
size = 0
def __init__(self):
self.size = 0
self.head = None #遍历链表
def a(self):
print("avx")
def printlist(self):
p=self.head
while(p is not None):
print(p.data)
p=p.next
print("——————————————————————————————————————") def insertlink(self, a, newdata):
newnode = Node(newdata)
if self.size == 0:
print("The link is none")
self.head = newnode
self.size = self.size+1
else:
p = self.head
while(p is not None )and (p.data != a):
p = p.next
if p.next is None:
p.next = newnode
self.size = self.size + 1
else:
newnode.next = p.next
p.next = newnode
self.size = self.size + 1 #删除链表中的节点
def deldata(self,a):
if self.size == 0:
print("The link is none")
elif self.size ==1:
self.head = None
self.size = self.size -1
else:
p = self.head
while(p is not None )and (p.data != a):
q = p
p = p.next
if p is None:
print("Can't find a")
elif p == self.head:
self.head = p.next
elif p.data ==a and p.next is not None:
q.next = q.next.next
self.size = self.size - 1
else:
q.next = None
self.size = self.size - 1 #修改链表中的指定节点
def updatelink(self,a,b):
p = self.head
print(p.data)
while(p is not None ) and (p.data!=a):
p = p.next
if p is None:
print("Can't find a")
else:
p.data = b if __name__=="__main__":
p = List()
p.insertlink(1,1)
p.insertlink(1,2)
p.insertlink(1,3)
p.insertlink(1,4)
print("_________________________---insertlink")
p.printlist()
print("_________________________--chalink")
p.updatelink(2,5)
p.printlist()
print("___________________________-----dellink")
p.deldata(5)
p.printlist()
 
 
 
双向链表的结构如下图:
head是头节点,tail是尾节点,每个节点由Data存储对象,Next对下一个节点的引用和Pre对上一个节点的引用组成。可以实现双向的遍历
 
下面说一下双向链表的插入和删除
 
插入一个新节点:
原理:
找到要插入的节点位置,新节点的Next指向插入位置的下一个节点,插入位置的下一个节点的Pre指向新节点。
插入位置节点的左侧Next指向新节点,新节点的Pre指向左侧的节点。
 
删除一个节点:
说明:
找到要删除的节点的上一个节点
直接把上一个节点的Next指向要删除节点的下一个节点
并把要删除节点的下一个节点的Pre指向要上出节点的上一个节点即可
 
双向链表的代码:
 
class Node():
    data = None
nextnode = None
prenode = None
def __init__(self, data):
self.data = data
class PersonChan():
size = 0
head = None
tail = None
def __init__(self):
self.head = None
self.tail = None
self.size = 0
#增加节点
def add_node(self, a):
newnode = Node(a)
if(self.head == None):
self.head = newnode
self.head.prenode = None
self.tail = newnode
self.tail.prenode = None
self.tail.nextnode = None
self.size = self.size+1
else:
temp = self.head
while temp.nextnode is not None:#返回尾节点tail
temp = temp.nextnode
temp.nextnode = newnode
self.tail = newnode
self.tail.prenode = temp
self.tail.nextnode = None
self.size = self.size+1
#在查找到的a后面增加节点
def ins_node(self,a,b):
newnode = Node(b)
if self.head ==None:
self.head = newnode
self.tail = newnode
print("Insert success:",newnode.data)
self.size = self.size +1
else:
temp = self.head
while(temp is not None)&(temp.data != a):
temp = temp.nextnode
if temp.nextnode == None:
temp.nextnode = newnode
self.tail = newnode
self.tail.prenode = temp
self.tail.nextnode = None
temp = None
print("Insert success:",newnode.data)
self.size = self.size+1
else:
newnode.prenode = temp
newnode.nextnode = temp.nextnode
temp.nextnode = newnode
print("Insert success:",newnode.data)
self.size = self.size+1
#删除节点
def del_node(self,a):
if self.head == None:
pass
elif self.head.data == a:
if self.size ==1:
self.head = None
self.tail = None
self.size = self.size-1
else:
self.head = self.head.nextnode
self.size = self.size -1
else:
temp = self.head.nextnode
while (temp is not None) and (temp.data != a):
temp = temp.nextnode
p = temp.prenode
if temp != None:
if temp.nextnode == None: self.tail = p
self.tail.nextnod = None
else:
p.nextnode = temp.nextnode
temp = None
self.size = self.size -1
print("Delete is success:",a)
def listall(self):#正序排列
if self.size == 0:
print("No data in the list")
else:
temp = self.head
while(temp is not None):
print(temp.data)
temp = temp.nextnode
def lista(self):#倒序排列
if self.size == 0:
print("No data in the list")
temp = self.tail
while(temp is not None):
print(temp.data)
temp = temp.prenode if __name__ == '__main__':
link = PersonChan()
link.add_node(1)
link.add_node(2)
link.add_node(3)
link.add_node(4)
link.listall()
print("The list's size is:",link.size)
link.lista()

用Python写单向链表和双向链表的更多相关文章

  1. Python 单向链表、双向链表

    用面向对象实现Linkedlist链表 单向链表实现append.iternodes 双向链表实现append.pop.insert.remove.iternodes 单向链表与双向链表 单向链表: ...

  2. Python链表的实现与使用(单向链表与双向链表)

    参考[易百教程]用Python实现链表及其功能 """ python链表的基本操作:节点.链表.增删改查 """ import sys cl ...

  3. Java-链表(单向链表、双向链表)

    Java-链表 1.什么是链表? 2.链表的特点是什么? 3.链表的实现原理? 4.如何自己写出一个链表? 1.什么是链表? 链表是一种物理存储单元上非连续.非顺序的存储结构,数据元素的逻辑顺序是通过 ...

  4. 用python实现单向链表

    单向链表 单向链表也叫单链表,是链表中最简单的一种形式,它的每个节点包含两个域,一个信息域(元素域)和一个链接域.这个链接指向链表中的下一个节点,而最后一个节点的链接域则指向一个空值. 表元素域ele ...

  5. JS实现单向链表、双向链表、循环链表

    https://cloud.tencent.com/developer/article/1114246 链表存储有序的元素的集合,但是和数组不同的是,链表中的元素在内存中的存储并不是连续的.每一个链表 ...

  6. python数据结构——单向链表

    链表 ( Linked List ) 定义:由许多相同数据类型的数据项按照特定顺序排列而成的线性表. 特点:各个数据在计算机中是随机存放且不连续. 优点:数据的增删改查都很方便,当有新的数据加入的时候 ...

  7. 《Java数据结构》链表结构(单向链表,双向链表)

    单向链表(单链表)是链表的一种,其特点是链表的链接方向是单向的,对链表的访问要通过顺序读取从头部开始:链表是使用指针进行构造的列表:又称为结点列表,因为链表是由一个个结点组装起来的:其中每个结点都有指 ...

  8. MySQL记录之间是单向链表还是双向链表?

    前言 本文的观点是基于MySQL使用Innodb存储引擎的情况下进行的! 很多渠道说:MySQL数据按照主键大小依次排列,记录之间是双向链表连起来.如果说我告诉你这种说法很大程度上是错的,你肯定说我在 ...

  9. python实现单向链表

    #Definition for singly-linked list. class ListNode(object): def __init__(self, x): self.val = x self ...

随机推荐

  1. SpringMVC的注解方式配置

    SpringMVC支持使用注解方式配置,比配置文件方式更加灵活易用,是SpringMVC使用的主流模式. 1.在配置文件中开启SpringMVC的注解 <!-- 开启包扫描 --> < ...

  2. ASP.NET Web Pages:PHP

    ylbtech-.Net-ASP.NET Web Pages:PHP 1.返回顶部 1. ASP.NET Web Pages - PHP PHP 开发人员请注意,Web Pages 可以用 PHP 编 ...

  3. 杂项:.NET Framework

    ylbtech-杂项:.NET Framework Microsoft .NET Framework是用于Windows的新托管代码编程模型.它将强大的功能与新技术结合起来,用于构建具有视觉上引人注目 ...

  4. 【转载】webstorm-前端javascript开发神器中文教程和技巧分享

    webstorm是一款前端javascript开发编辑的神器,此文介绍webstorm的中文教程和技巧分享. webstorm8.0.3中文汉化版下载:百度网盘下载:http://pan.baidu. ...

  5. java-appium-527手机浏览器、PC端程序、grid模式

    1.手机浏览器 2.window通用成语自动化 3.appium支持grid模式

  6. 【BZOJ】1101 [POI2007]Zap(莫比乌斯反演)

    题目 传送门:QWQ 分析 莫比乌斯反演. 还不是很熟练qwq 代码 //bzoj1101 //给出a,b,d,询问有多少对二元组(x,y)满足gcd(x,y)=d.x<=a,y<=b # ...

  7. 阳虚体质外感/胃脘痛/经期抽搐x案

    * 咽干咽痛   某女 42岁 在40岁产下一子,后体质明显不如以前,几年以来,易感冒,咳嗽 每次在社区医院输液,少则一个月,多则几个月方能愈,几天前外感微咳,咽痛声嘶 观其咽并不红,舌淡苔薄白 双手 ...

  8. spark streaming 概述

    批处理 & 流处理 像这个是批处理 像这样就是流处理 为什么需要流处理--更多场景需要 Spark Core & RDD 本质上是离线运算 Spark Streaming是什么(分布式 ...

  9. Nature | 光学CNN层替换传统CNN层,超省电

    CNN 计算效率的研究一直备受关注,但由于功率和带宽的严格限制,CNN 仍难以应用在嵌入式系统如移动视觉.自动驾驶中.在斯坦福大学发表在 Nature 旗下 Scientific Reports 的这 ...

  10. QEMU,KVM及QEMU-KVM介绍

    What's QEMU QEMU是一个主机上的VMM(virtual machine monitor),通过动态二进制转换来模拟CPU,并提供一系列的硬件模型,使guest os认为自己和硬件直接打交 ...