【数据结构2】链表(使用头插法和尾插法创建链表)、链表的插入和删除、双链表节点的插入、双链表节点的删除

1 链表
1.2 使用头插法和尾插法创建链表
2 链表的插入和删除
3 双链表
3.1 双链表节点的插入
3.2 双链表节点的删除

链表是由一系列节点组成的元素集合。每个节点包含两部分,数据域item和指向下一个节点的指针next。
通过节点之间的相互连接最终串联成一个链表。

在这里插入图片描述

class Node:
    def __init__(self, item=None):
        self.item = item  # 存储节点的数据
        self.next = None  # 指向下一个节点的指针,初始为 None


# a = Node(1)
# b = Node(2)
# c = Node(3)
# a.next = b
# b.next = c
#
# print(a.next.next.item)

在这里插入图片描述

def create_link_list_head(li: list):
    """
    使用头插法创建链表
    头插法的特点是新节点总是插入到链表的头部,因此链表的顺序会与原始列表相反。

    :param li: 包含要插入的元素的列表
    :return: 链表的头节点
    """
    head = Node(li[0])  # 初始化链表的头节点
    for element in li[1:]:  # 从列表的第二个元素开始遍历
        node = Node(element)  # 创建一个新的节点
        node.next = head  # 新节点的 next 指向当前的头节点
        head = node  # 更新头节点为新创建的节点
    return head  # 返回新链表的头节点


def create_link_list_tail(li: list):
    """
    使用尾插法创建链表
    尾插法的特点是新节点总是插入到链表的尾部,因此链表的顺序与原始列表相同。

    :param li: 包含要插入的元素的列表
    :return: 链表的头节点
    """
    head = Node(li[0])  # 初始化链表的头节点
    tail = head  # 初始化尾节点为头节点
    for element in li[1:]:  # 从列表的第二个元素开始遍历
        node = Node(element)  # 创建一个新的节点
        tail.next = node  # 当前尾节点的 next 指向新节点
        tail = node  # 更新尾节点为新创建的节点
    return head  # 返回链表的头节点


def print_link_list(lk):
    """
    打印链表中的所有节点
    从链表的头节点开始,逐个打印每个节点的值,直到链表的末尾。

    :param lk: 链表的头节点
    """
    while lk:  # 当当前节点不为 None 时继续循环
        print(lk.item, end=',')  # 打印当前节点的值,并在末尾加上逗号
        lk = lk.next  # 将当前节点更新为下一个节点


lk = create_link_list_head([1, 23, 33])
# lk = create_link_list_tail([1, 23, 33, 44])
print_link_list(lk)

2 链表的插入和删除

在这里插入图片描述

链表节点的插入 把4查到1和2中间

在这里插入图片描述
链表节点的插入可以分为几种常见情况:
在链表的头部插入节点、在链表的尾部插入节点、以及在链表的中间某个位置插入节点。

1. 在链表头部插入节点

在链表头部插入节点,也称为头插法,操作相对简单。新节点会成为链表的第一个节点,原来的头节点将成为第二个节点。

class Node:
    def __init__(self, item=None):
        self.item = item  # 存储节点的数据
        self.next = None  # 指向下一个节点的指针

def insert_at_head(head: Node, item) -> Node:
    """
    在链表头部插入新节点
    :param head: 链表的头节点
    :param item: 要插入的新数据
    :return: 新的头节点
    """
    new_node = Node(item)  # 创建一个新的节点
    new_node.next = head  # 新节点的 next 指向当前的头节点
    return new_node  # 新节点现在成为头
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值