数据结构之链表结构

1.链表结构

  • 数组:
    要存储多个元素,数组(或列表)可能是最常用的数据结构。
    我们之前说过, 几乎每一种编程语言都有默认实现数组结构, 这种数据结构非常方便,提供了一个便利的[]语法来访问它的元素。
    但是数组也有很多缺点:
    • 数组的创建通常需要申请一段连续的内存空间(一整块的内存), 并且大小是固定的(大多数编程语言数组都是固定的), 所以当当前数组不能满足容量需求时, 需要扩容. (一般情况下是申请一个更大的数组, 比如2倍. 然后将原数组中的元素复制过去)
    • 而且在数组开头或中间位置插入数据的成本很高, 需要进行大量元素的位移.(尽管我们已经学过的JavaScript的Array类方法可以帮我们做这些事,但背后的原理依然是这样)。
  • 链表
    要存储多个元素, 另外一个选择就是使用链表.
    但不同于数组, 链表中的元素在内存中不必是连续的空间.
    链表的每个元素由一个存储元素本身的节点和一个指向下一个元素的引用(有些语言称为指针或者链接)组成.
    • 相对于数组, 链表有一些优点:
      • 内存空间不是比是连续的. 可以充分利用计算机的内存. 实现灵活的内存动态管理.
      • 链表不必在创建时就确定大小, 并且大小可以无限的延伸下去.
      • 链表在插入和删除数据时, 时间复杂度可以达到O(1). 相对数组效率高很多.
    • 相对于数组, 链表有一些缺点:
      • 链表访问任何一个位置的元素时, 都需要从头开始访问.(无法跳过第一个元素访问任何一个元素).
      • 无法通过下标直接访问元素, 需要从头一个个访问, 直到找到对应的问题.

1.1单链表结构和双链表结构

  • 链表结构(linked structure)
    • 单链表结构(singly linked structure)
      • 头链接(head link)
      • 空链接(empty link)
    • 双链表结构(doubly linked structure)
      • 头链接(head link)
      • 空链接(empty link)
      • 尾链接(tail link)

在这里插入图片描述

1.2非连续性内存和节点

  • 链表中的基本单位表示是节点
    • 单链表节点
      • 一个数据项
      • 到结构中的下一个节点的一个链接
  • 链表结构将结构中的项的逻辑顺序和内存中的顺序解耦
  • 设置节点使用不连续内存的方式:
    • 方式一:(FORTRAN)
      两个并行数组,一个数组包含了数据项,另一个数组根据数据数组中对应的项,包含了其后继项在数据数组中的索引位置。
    • 方式二:(C++)
      单链表结构中的一个节点,包含了一个数据项和指针值,一个特殊的空值,表示的指针值是一个空链接
    • 方式三:(Python)
      单链表节点定义包含两个字段的一个对象。一个字段是数据项的一个引用,另一个是到另一个节点的引用。python为每个新的节点对象提供了动态分配的非连续内存,并且当对象不再被应用程序引用的时候,会自动把内存返回给系统(垃圾回收)。

1.3单链接节点类

class Node(object):
    """单链表节点类"""
    def __init__(self, data, next = None):
        self.data = data
        self.next = next

# 没有指向节点对象
node1 = None
# 指向链接的A对象
node2 = Node("A", None)		# 下一个对象指针为None
# 指向链接的B对象
node3 = Node("B", node2)

node1= Node('C', node3)

执行结果
在这里插入图片描述

1.4单链表结构上的操作

1.4.1遍历(traversal)

from lib.node import Node

head = None
# 在链接结构的开头添加五个节点
for count in range(1, 6,):
    head = Node(count, head)

probe = head
while probe != None:
    probe = probe.next

执行结果
在这里插入图片描述

1.4.2 搜索

搜索第4项

  • 方式一:
from lib.node import Node

head = None

for count in range(1, 6,):
    head = Node(count, head)

probe = head
targetItem = 3
while probe != None and targetItem != probe.data:
    probe = probe.next

if probe != None:
    print("targetItem has been found")
    print(probe.data)
else:
    print("targetItem is not in the linked structure")

targetItem has been found
  • 方式二
from lib.node import Node

head = None

for count in range(1, 6,):
    head = Node(count, head)

index = 3

def func(index):
    probe = head
    while index > 0:
        probe = probe.next
        index -= 1

    return probe.data

print(func(index))
2

1.4.3替换

替换第3项

  • 方式一
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值