码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 编程基础 —— 链表


    目录

    1 单链表的逻辑结构与存储结构

    2 单链表的定义

    3 插入元素

    4 删除元素

    5 创建单链表

    (1)尾插法

    (2)头插法

    6 双链表

    7 循环链表

    (1)循环单链表

    (2)循环双链表

    8 练习

    (1)移除链表元素

    (2)旋转链表

    1 单链表的逻辑结构与存储结构

    • 逻辑结构:数据元素之间的逻辑关系
      • 集合、线性结构(一对一)、树形结构(一对多)、图结构(多对多)
    • 存储结构:顺序存储、链式存储、索引存储、散列存储
      • 顺序存储(顺序表):逻辑上相邻的元素物理位置也相邻
      • 链式存储(单链表):逻辑上相邻的元素物理位置不一定相邻

    2 单链表的定义

    1. class ListNode:
    2. def __init__(self, val = 0, next = None):
    3. self.val = val
    4. self.next = next
    • 带头节点的单链表(写代码方便)
    • 不带头节点的单链表(写代码麻烦)

    3 插入元素

    1. # 在第i个位置插入elem
    2. def Inster(head, i, elem):
    3. assert i >= 0
    4. cur = head
    5. while i != 0:
    6. i -= 1
    7. cur = cur.next
    8. if not cur:
    9. return False
    10. temp = cur.next
    11. cur.next = elem
    12. elem.next = temp
    13. return True

    4 删除元素

    1. def ListDelete(head, i):
    2. assert i >= 0
    3. cur = head
    4. while i >= 0:
    5. i -= 1
    6. cur = cur.next
    7. if not cur.next:
    8. return False
    9. cur.next = cur.next.next
    10. return True

    5 创建单链表

    (1)尾插法

    1. def BulidLink_Head(l):
    2. head = ListNode()
    3. temp = head
    4. for elem in l:
    5. temp.next = ListNode(elem)
    6. temp = temp.next
    7. return head
    8. head = BulidLink_Tail([1,2,3,4])
    9. while head.next:
    10. head = head.next
    11. print(head.val)

    (2)头插法

    1. def BulidLink_Head(l):
    2. head = ListNode()
    3. temp = head
    4. for elem in l:
    5. temp = head.next
    6. head.next = ListNode(elem, temp)
    7. return head

    6 双链表

    解决单链表无法逆向索引的问题

    1. class DLinkNode:
    2. def __init__(self, val = 0, next = Node, prior):
    3. self.val = val
    4. self.next = next
    5. self.prior = prior

    7 循环链表

    (1)循环单链表

    从一个结点出发可以找到其他任何结点

    (2)循环双链表

    从头找到尾和从尾找到头的时间复杂度都是O(1)

    8 练习

    (1)移除链表元素

    一个链表的头节点head和一个整数val,请删除链表中所有满足Node.val == val的节点,并返回新的头节点。

    1. class solution:
    2. def removeElements(self, head, val):
    3. head = ListNode(next = head)
    4. pre = head
    5. while pre.next:
    6. if pre.next.val == val:
    7. pre.next = pre.next.next
    8. else:
    9. pre = pre.next
    10. return head.next

    (2)旋转链表

    一个链表的头节点head ,旋转链表;将链表每个节点向右移动k个位置。

    1. class solution:
    2. def rotateRight(self, head, k):
    3. if not head:
    4. return None
    5. length = 0
    6. temp = head
    7. while temp.next:
    8. length += 1
    9. temp = temp.next
    10. temp.next = head
    11. k = k % (length + 1)
    12. temp = head
    13. for i in range(length - k):
    14. temp = temp.next
    15. head = temp.next
    16. temp.next = None
    17. return head
  • 相关阅读:
    商城系统搭建:三方平台入驻与独立部署优缺点对比
    vite脚手架简单使用
    MySQL分布式事务xa的介绍与使用
    国金证券DevOps建设项目分享——嘉为蓝鲸
    Redis实战——分布式锁
    uniapp如何在页面中只展示一条随机数据
    深入理解Java基本数据类型与引用数据类型
    【每日一读】Joint Unsupervised Learning of Deep Representations and Image Clusters
    固态硬盘接口类型介绍
    过滤对象数组中有重复值的项
  • 原文地址:https://blog.csdn.net/waywardG/article/details/125628591
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号