当前位置: 首页 > news >正文

数据结构——双链表

双链表的结构

双链表的结构

  • 表元素域val用来存放具体的数据。
  • 链接域pre用来存放上一个节点的位置。
  • 链接域next用来存放下一个节点的位置。

双链表节点实现

class DoubleLinkListNode(object):"""双向链表节点类初始化"""def __init__(self, pre=None, val=None, next=None):self.pre = preself.val = valself.next = next

双链表的实现

class DoubleLinkList(object):"""双向链表实现类"""def __init__(self, *args, **kwargs):self.length = 0self.head = None

图解说明

双链表类整体结构

  • is_empty() 链表是否为空
  • traversal() 遍历整个链表
  • add(item) 链表头部添加元素
  • append(item) 链表尾部添加元素
  • insert(pos, item) 指定位置添加元素
  • remove(item) 删除节点
  • search(item) 查找节点是否存在

双链表-头部添加元素(add)

def add(self, value):"""双向链表在头部添加元素"""cur = DoubleLinkListNode(val=value)if self.is_empty():self.head = curelse:self.head.pre = curcur.next = self.headself.head = curself.length += 1

图解说明

双链表头部添加元素

双链表-遍历(traversal)

def traversal(self):"""遍历双向链表:return:"""cur_node = self.headwhile cur_node:print(cur_node.val, end=" ")cur_node = cur_node.next

图解说明

双链表遍历

双链表-尾部插入元素(append)

def append(self, value):"""双向链表尾部添加:param value::return:"""new_node = DoubleLinkListNode(val=value)if self.is_empty():self.head = new_nodeelse:cur = self.headwhile cur.next:cur = cur.nextcur.next = new_nodenew_node.pre = curself.length += 1

图解说明

请添加图片描述

双链表-指定位置插入元素(insert)

def insert(self, index, value):"""双向链表指定位置插入元素:param index::param value::return:"""count = 0cur = self.headprint('index==', index)print('self.length', self.length)if index > self.length or index < 0:raise IndexError("DoubleLinkList assignment index out of range")elif index == 0:self.add(value)elif index == self.length:self.append(value)else:new_node = DoubleLinkListNode(value)while count < index:cur = cur.nextcount += 1new_node.pre = curif cur.next:new_node.next = cur.nextcur.next.pre = new_nodecur.next = new_nodeelse:cur.next = new_nodeself.length += 1

图解说明

请添加图片描述

双链表-查找指定元素(search)

def search(self, value):"""查找指定元素, 返回元素是否存在标识及索引下标:param value::return:"""flag = Falsecount = 0cur = self.headwhile cur != None and cur.val != value:count += 1cur = cur.nextif cur and cur.val == value:flag = Trueelse:raise ValueError("%s is not in sequential list" % value)print('flag: %s, count: %s' % (flag, count))return flag, count

图解说明

双链表查找指定元素

双链表-删除元素(remove)

def remove(self, value):"""双向链表移除元素:return:"""cur = self.headwhile cur.next:if cur.val == value:cur.pre.next = cur.nextcur.next.pre = cur.preself.length -= 1del curbreakelse:cur = cur.next

图解说明

双链表删除元素

双链表-完整代码及测试

# -*- coding:utf-8 -*-class DoubleLinkListNode(object):"""双向链表节点类初始化"""def __init__(self, pre=None, val=None, next=None):self.pre = preself.val = valself.next = nextclass DoubleLinkList(object):"""双向链表实现类"""def __init__(self, *args, **kwargs):self.length = 0self.head = Nonedef is_empty(self):return self.head is Nonedef __len__(self):return self.lengthdef search(self, value):"""查找指定元素, 返回元素是否存在标识及索引下标:param value::return:"""flag = Falsecount = 0cur = self.headwhile cur != None and cur.val != value:count += 1cur = cur.nextif cur and cur.val == value:flag = Trueelse:raise ValueError("%s is not in sequential list" % value)print('flag: %s, count: %s' % (flag, count))return flag, countdef insert(self, index, value):"""双向链表指定位置插入元素:param index::param value::return:"""count = 0cur = self.headprint('index==', index)print('self.length', self.length)if index > self.length or index < 0:raise IndexError("DoubleLinkList assignment index out of range")elif index == 0:self.add(value)elif index == self.length:self.append(value)else:new_node = DoubleLinkListNode(value)while count < index:cur = cur.nextcount += 1new_node.pre = curif cur.next:new_node.next = cur.nextcur.next.pre = new_nodecur.next = new_nodeelse:cur.next = new_nodeself.length += 1def append(self, value):"""双向链表尾部添加:param value::return:"""new_node = DoubleLinkListNode(val=value)if self.is_empty():self.head = new_nodeelse:cur = self.headwhile cur.next:cur = cur.nextcur.next = new_nodenew_node.pre = curself.length += 1def add(self, value):"""双向链表在头部添加元素"""cur = DoubleLinkListNode(val=value)if self.is_empty():self.head = curelse:self.head.pre = curcur.next = self.headself.head = curself.length += 1def traversal(self):"""遍历双向链表:return:"""cur_node = self.headwhile cur_node:print(cur_node.val, end=" ")cur_node = cur_node.nextdef remove(self, value):"""双向链表移除元素:return:"""cur = self.headwhile cur.next:if cur.val == value:cur.pre.next = cur.nextcur.next.pre = cur.preself.length -= 1del curbreakelse:cur = cur.nextdef main():doublelinklist = DoubleLinkList()doublelinklist.append(1)doublelinklist.append(2)doublelinklist.add(3)doublelinklist.append(4)doublelinklist.insert(4, 666)doublelinklist.insert(5, 888)doublelinklist.search(666)doublelinklist.traversal()print()doublelinklist.remove(666)doublelinklist.traversal()if __name__ == '__main__':main()

http://www.mrgr.cn/news/67786.html

相关文章:

  • Node.js简介以及安装部署 (基础介绍 一)
  • display:none后没有过度动画,transition未生效
  • 【MFC编程(一)】MFC概述
  • nuiapp vue3 uni-ui uni.uploadFile 图片上传
  • pinctrl语法
  • FileLink跨网数据摆渡系统:打破网络隔阂,轻松实现跨网络数据传输
  • 双11疯狂凑单:累坏买家,坑惨卖家
  • 基于TRIZ的教育机器人功能创新
  • 动漫风格大模型和lora推荐
  • 基于 ESP AT 固件使用 BLE 静态配对码完成安全连接和通信
  • 《清宫辞Ⅱ》开机:陈欣予旗装惊艳回归 重新演绎宫闱传奇
  • 树状数组浅谈
  • 论文阅读:基于语义分割的非结构化田间道路场景识别
  • 100种算法【Python版】第55篇——Delaunay三角剖分之Bowyer-Watson算法
  • SSH实验3拒绝root用户远程登录
  • 2024.11.6:艾灸
  • hdmi介绍及DRM实现
  • 《现代网络技术》读书笔记:需求和技术
  • 年入百万:从初中辍学到 50 万读者!
  • audacity 保存中文文件保存报错问题解决
  • C++ OpenCV 理想滤波
  • opencv各个模块的概念说明
  • 人工智能:革新医疗、企业与日常生活的未来
  • 【Qt问题】解决 Cannot retrieve debugging output
  • 如何写研究的结论与讨论部分
  • 大模型开发企业智能小助手应用上篇