【算法·命运-10】单链表

单链表(Singly Linked List)是一种线性数据结构,由一系列节点(Node)组成。每个节点包含两个部分:数据(Data)和指向下一个节点的指针(Next)。在单链表中,每个节点只能指向下一个节点,因此只能沿着链表的方向进行遍历。

下面是一个简单的单链表实现的例子,使用 Python 编写。

单链表节点类

每个节点包含数据部分和指向下一个节点的指针。

class Node:
    def __init__(self, data):
        self.data = data  # 节点的数据
        self.next = None  # 下一个节点的指针,默认为 None

单链表类

单链表类包含一些基本操作,例如插入、删除、遍历等。

class SinglyLinkedList:
    def __init__(self):
        self.head = None  # 初始时链表为空

    # 向链表末尾插入新节点
    def append(self, data):
        new_node = Node(data)
        if not self.head:  # 如果链表为空,将新节点作为头节点
            self.head = new_node
            return
        last_node = self.head
        while last_node.next:  # 找到链表的最后一个节点
            last_node = last_node.next
        last_node.next = new_node  # 将最后一个节点的 next 指向新节点

    # 打印链表
    def print_list(self):
        current_node = self.head
        while current_node:
            print(current_node.data, end=" -> ")
            current_node = current_node.next
        print("None")

    # 在链表头插入新节点
    def prepend(self, data):
        new_node = Node(data)
        new_node.next = self.head  # 新节点指向原来的头节点
        self.head = new_node  # 更新头节点为新节点

    # 删除链表中的某个节点
    def delete(self, key):
        current_node = self.head
        # 如果头节点就是要删除的节点
        if current_node and current_node.data == key:
            self.head = current_node.next
            current_node = None
            return
        
        prev_node = None
        while current_node and current_node.data != key:
            prev_node = current_node
            current_node = current_node.next
        
        if current_node is None:
            print(f"Node with data {key} not found")
            return

        prev_node.next = current_node.next  # 跳过当前节点
        current_node = None  # 释放当前节点

    # 查找链表中是否有某个值
    def search(self, key):
        current_node = self.head
        while current_node:
            if current_node.data == key:
                return True
            current_node = current_node.next
        return False

使用示例

# 创建一个空链表
linked_list = SinglyLinkedList()

# 向链表中添加节点
linked_list.append(1)
linked_list.append(2)
linked_list.append(3)

# 打印链表
linked_list.print_list()  # 1 -> 2 -> 3 -> None

# 在链表头部插入节点
linked_list.prepend(0)
linked_list.print_list()  # 0 -> 1 -> 2 -> 3 -> None

# 删除链表中的一个节点
linked_list.delete(2)
linked_list.print_list()  # 0 -> 1 -> 3 -> None

# 查找链表中的某个节点
print(linked_list.search(1))  # True
print(linked_list.search(4))  # False

解释:

  1. Node 类:表示链表中的一个节点,每个节点有 datanext 两个属性,data 存储数据,next 是指向下一个节点的指针。
  2. SinglyLinkedList 类:这是单链表的主要类,包含了插入、删除、查找和打印链表的方法。
  3. append 方法:在链表末尾添加新节点。
  4. prepend 方法:在链表头部插入新节点。
  5. delete 方法:删除指定值的节点。
  6. search 方法:查找链表中是否存在某个值。

这个实现展示了一个基本的单链表操作,你可以根据需要进一步扩展,比如增加反向遍历、链表长度计算等功能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值