数据结构之链表

本文介绍了链表和顺序表的概念,并详细讲解了单链表和双链表的创建、遍历、插入和删除操作。单链表每个节点仅包含后继节点指针,而双链表则包含前驱和后继节点指针,便于双向查找。通过示例代码展示了两种链表的具体实现,并对比了链表与顺序表在插入和删除效率上的优势。
摘要由CSDN通过智能技术生成

和顺序表相对应,有个链式存储的数据结构,命名曰链表。

单链表

节点中只存储后项节点指针的链表,称为单链表。

# 定义节点
class LinkNode(object):
    def __init__(self, data=None):
        self.data = data
        self.next = None

关于单链表的创建、遍历、插入和删除代码示例如下:

# 2021.11.8
# 链表

# 定义节点
class LinkNode(object):
    def __init__(self, data=None):
        self.data = data
        self.next = None

# 创建链表:头插法
def create_link_list_head(li):
    head = LinkNode(li[0])
    for item in li[1:]:
        node = LinkNode(item)
        node.next = head
        head = node
    return head

# 创建链表: 尾插法
def create_link_list_tail(li):
    head = LinkNode(li[0])
    tail = head
    for item in li[1:]:
        node = LinkNode(item)
        tail.next = node
        tail = node
    return head

# 遍历链表
def print_link_list(link_list):
    while link_list:
        print(link_list.data)
        link_list = link_list.next

# 链表插入:将p_node 插入到cur_node 后面
def insert_link_list(cur_node, p_node):
    p_node.next = cur_node.next
    cur_node.next = p_node

# 链表删除:将cur_node后面节点删除
def delete_link_list(cur_node):
    p_node = cur_node.next
    cur_node.next = p_node.next
    del p_node

if __name__ == '__main__':
    li = [2, 3, 1, 5]
    # 创建和遍历打印
    h = create_link_list_tail(li)
    print_link_list(h)
    # 链表插入节点
    p_node = LinkNode(8)
    insert_link_list(h, p_node)
    print_link_list(h)
    # 链表删除节点
    delete_link_list(h)
    print_link_list(h)

双链表

要找到链表中的某个元素,必须从链表头节点开始,通过节点的next指针依次去查找。而双链表通过节点的前项指针可更为方便地去查找。

双链表节点中除了存储数据,还有前项指针和后项指针。

class DoubleLinkListNode(object):
    def __init__(self, data):
        self.data = data
        self.next = None
        self.pre = None

关于双链表的创建、遍历、插入和删除代码示例如下:

# 2021.11.8
# 双链表

class DoubleLinkListNode(object):
    def __init__(self, data):
        self.data = data
        self.next = None
        self.pre = None

# 双链表创建:头插法
def create_double_link_list_head(li):
    head = DoubleLinkListNode(li[0])
    for item in li[1:]:
        node = DoubleLinkListNode(item)
        node.next = head
        head.pre = node
        head = node
    return head

# 双链表创建:尾插法
def create_double_link_list_tail(li):
    head = DoubleLinkListNode(li[0])
    tail = head
    for item in li[1:]:
        node = DoubleLinkListNode(item)
        tail.next = node
        node.pre = tail
        tail = node
    return head

# 遍历双链表
def print_double_link_list(double_link_list):
    while double_link_list:
        print(double_link_list.data)
        double_link_list = double_link_list.next

# 双链表插入
def insert_double_link_list(cur_node, p_node):
    p_node.next = cur_node.next
    cur_node.next.pre = p_node
    cur_node.next = p_node
    p_node.pre = cur_node

# 双链表删除: 删除cur_node后面的节点p_node
def delete_double_link_list(cur_node):
    p_node = cur_node.next
    cur_node.next = p_node.next
    p_node.next.pre = cur_node
    del p_node

if __name__ == '__main__':
    li = [2, 3, 1, 5]
    # 双链表创建
    h = create_double_link_list_tail(li)
    print_double_link_list(h)
    # 双链表插入
    p_node = DoubleLinkListNode(8)
    insert_double_link_list(h.next, p_node)
    print_double_link_list(h)
    # 双链表删除
    delete_double_link_list(h.next)
    print_double_link_list(h)

小结

链表和顺序表对比:

  • 链表插入和删除速度比顺序表要快,复杂度为O(1);
  • 链表节点数据在内存中存储非连续,链表扩充比较方便;
  • 链表链式存储为数和图等数据结构做好铺垫。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值