leetcode-explore-learn-数据结构-链表4

  • 双链表的设计

本系列博文为leetcode-explore-learn子栏目学习笔记,如有不详之处,请参考leetcode官网:https://leetcode-cn.com/explore/learn/card/linked-list/

所有例题的编程语言为python

双链表的设计

双链表的节点类:

class ListNode:def __init__(self,x):self.val=xself.next=Noneself.prev=None

在链表类中实现以下功能:
1.get(index):获取第index个节点的值,如果索引无效则返回-1
–index从0开始,因此初始化curr=self.head之后,需要往后在操作index+1次即[0,index]

2.addAtHead(val):在链表的第一个元素之前家一个值为val的节点,插入后,新节点将成为链表的第一个节点。
–pred=self.head(伪头节点),succ=self.head.next

3.addAtTail(val):将值为val的节点追加到链表的最后一个元素
–succ=self.tial(伪尾节点),pred=self.tail.prev

4.addAtIndex(index,val):在链表中的第index个节点之前加入值为val的节点,如果index等于链表长度,则该节点将附加于链表的末尾。如果index大于链表的长度则不会加入节点。如果index小于0,则在头部添加节点。
–第index个节点为succ节点,index-1个节点为pred节点。
–从前往后:pred=self.head(初始化)再操作[0,index-1]次;
–由后往前:succ=self.tail(初始化)再操作[index,size-1]次(size-index次)

5.deleteAtIndex(index):如果索引index有效,则删除链表中的第index个节点。
–由前往后:找到第index-1个节点为pred [0,inde1],succ=pred.next.next;
–由后往前:找到index+1个节点为succ.

class ListNode:def __init__(self,x):self.val=xself.next=Noneself.prev=Noneclass MyLinkedList(object):def __init__(self):"""Initialize your data structure here."""self.size=0self.head,self.tail=ListNode(0),ListNode(0)self.head.next=self.tail     # 这两句的作用是什么,变成一个环?self.tail.prev=self.headdef get(self, index):"""Get the value of the index-th node in the linked list. If the index is invalid, return -1.:type index: int:rtype: int"""if index<0 or index>=self.size:return -1if index+1<self.size-index:curr=self.headfor _ in range(index+1): # [0,index]curr=curr.nextelse:curr=self.tailfor _ in range(self.size-index):curr=curr.prevreturn curr.valdef addAtHead(self, val):"""Add a node of value val before the first element of the linked list. After the insertion, the new node will be the first node of the linked list.:type val: int:rtype: None"""pred,succ=self.head,self.head.nextself.size+=1to_add=ListNode(val)to_add.prev=predto_add.next=succpred.next=to_addsucc.prev=to_adddef addAtTail(self, val):"""Append a node of value val to the last element of the linked list.:type val: int:rtype: None"""succ,pred=self.tail,self.tail.prevself.size+=1to_add=ListNode(val)to_add.prev=predto_add.next=succpred.next=to_addsucc.prev=to_adddef addAtIndex(self, index, val):"""Add a node of value val before the index-th node in the linked list. If index equals to the length of linked list, the node will be appended to the end of linked list. If index is greater than the length, the node will not be inserted.:type index: int:type val: int:rtype: None"""if index>self.size:returnif index<0:index=0if index<self.size-index:pred=self.headfor _ in range(index):pred=pred.nextsucc=pred.nextelse:succ=self.tailfor _ in range(self.size-index):succ=succ.prev#print(succ.val)pred=succ.prevself.size+=1to_add=ListNode(val)#print(pred.val,succ.val,to_add.val)to_add.prev=predto_add.next=succpred.next=to_addsucc.prev=to_adddef deleteAtIndex(self, index):"""Delete the index-th node in the linked list, if the index is valid.:type index: int:rtype: None"""if index<0 or index>=self.size:returnif index<self.size-index:pred=self.headfor _ in range(index):pred=pred.nextsucc=pred.next.nextelse:succ=self.tailfor _ in range(self.size-index-1):succ=succ.prevpred=succ.prev.prevself.size-=1pred.next=succsucc.prev=pred

注意点:删除插入,最重要的是找到前驱和后继节点,可以双向操作之后需要判断由前往后,还有由后往前。

算法(12)-leetcode-explore-learn-数据结构-双链表的设计相关推荐

  1. 数据结构--双链表的创建和操作

    http://www.cnblogs.com/jingliming/p/4602144.html#0-tsina-1-42616-397232819ff9a47a7b7e80a40613cfe1 一. ...

  2. 数据结构-双链表基本操作(C语言实现)

    参考书:王道考研数据结构 (此贴为博主学习408的笔记,因博主也是学习者,个人总结如有错误欢迎指正.如有侵权请告知,马上删除致歉)​​ 一:双链表含义 双链表是在单链表的基础上增加了一个指向前驱结点的 ...

  3. 算法基础—数据结构—双链表

    双链表顾名思义就是一个从左到右的指针和一个从右到左的指针. 这里列一些模板 // e[]表示节点的值,l[]表示节点的左指针,r[]表示节点的右指针,idx表示当前用到了哪个节点 int e[N], ...

  4. c# 数据结构 ---双链表

    再来个双链表,其实和单链表差不多拉,循环链表也是,只是把尾元素指向Header就OK了.所以就不贴循环链表了.   1 /**//// <summary>   2    /// 双链表的节 ...

  5. 数据结构——双链表(C语言详述通用双链表)

    说明:   本文章旨在总结备份.方便以后查询,由于是个人总结,如有不对,欢迎指正:另外,内容大部分来自网络.书籍.和各类手册,如若侵权请告知,马上删帖致歉.   QQ 群 号:513683159 [相 ...

  6. 天勤考研数据结构———双链表操作

    定义双链表的结构体类型 typedef struct DLNode{     int data;     struct DLNode *next;     struct DLNode *prior; ...

  7. 数据结构 - 双链表的头插法和后插法

    1.单链表的局限性 -> 单链表是对数组的一个扩展,解决了数组的大小比较死板不容易扩展的问题.使用堆内存来存储数据,将数据分散到各个节点之间,其各个节点在内存中可以不相连,节点之间通过指针进行单 ...

  8. C#数据结构-双链表

    据说单链表没有回路,那么双链表也出现了,既包括后继指针,又加入了前驱指针,某个元素可以寻找他上面一个元素,也可以寻找到下一个元素.当然双链表也是链表的一种. 物理存储结构:不一定是连续的存储区域 逻辑 ...

  9. 【算法学习笔记】07.数据结构基础 链表 初步练习

    写这篇文章时离学完列表已经很久了 最近真的是很懒. 数据结构这部分在刘汝佳的白书上的部分太少了,我一点要找个时间好好的看一下程杰的大话. 链表的优点是它强调的是相关元素之间的相对顺序,左和右.其实可以 ...

最新文章

  1. div模拟的下拉框特效jquery
  2. linux wine 中文乱码,Linux下使用Wine出现中文乱码的解决方法
  3. 自己动手实现简易代码生成器、采用文本模板文件生成服务层、服务层接口代码的做法参考...
  4. IP与DSCP优先级
  5. mysql有没有批量游标_MySQL使用游标批量处理进行表操作_MySQL
  6. powerdesigner导出到mysql数据库
  7. appimage文件怎么安装_bauh:在一个界面中管理 Snap、Flatpak 和 AppImage | Linux 中国...
  8. Java面试,如何在短时间内做突击
  9. 借力阿里云存储产品 延锋彼欧加速数字化重塑
  10. PPG血氧饱和度计算
  11. 快速搭建react项目骨架(按需加载、redux、axios、项目级目录等等)
  12. 快速上手!mysql数据恢复的方法
  13. w ndows10专业版连接不上网,Windows10连不上无线网怎么办 Windows10修复网络教程
  14. matlab boxplot显示平均值,r – Boxplot显示平均值
  15. 一行代码实现安慰剂检验
  16. 鸿蒙系统的理解,我所理解的鸿蒙系统
  17. mysql 三表关联查询
  18. 集成学习(上):机器学习基础task1-熟悉机器学习的三大主要任务
  19. 财务知识入门——《富爸爸,穷爸爸》
  20. Spring Boot与Elasticsearch的对应版本

热门文章

  1. asterisk1.8 for mipsel mysql
  2. mysql的util_JDBC连接mysql工具类Util供大家参考
  3. php mvc 路由,PHP手写MVC (五)—— 路由
  4. 【转】细说.NET中的多线程 (四 使用锁进行同步)
  5. 【转】刨根究底字符编码之二——关键术语解释(下)
  6. [Sharepoint2007对象模型]第三回:Web应用程序(SPWebApplication)
  7. 数据结构与算法 - 递归回溯(迷宫问题)
  8. PWN-PRACTICE-BUUCTF-5
  9. 二叉排序树查找的c语言程序,C语言二叉排序(搜索)树实例
  10. 【牛客 - 696C】小w的禁忌与小G的长诗(dp 或 推公式容斥)