头图

大家好,我是涛哥,本文内容来自 涛哥聊Python ,转载请标原创。

更多Python学习内容:http://ipengtao.com

链表是一种常见的数据结构,它由一系列节点组成,每个节点包含一个数据域和一个指向下一个节点的指针。链表的优点是插入和删除操作非常高效,特别是在需要频繁修改数据结构的情况下。本文将详细介绍如何在Python中创建单链表,并包含相应的示例代码,帮助全面掌握这一基础而重要的技能。

什么是单链表

单链表是一种链式数据结构,其中每个节点包含一个数据域和一个指向下一个节点的指针。链表的第一个节点称为头节点,最后一个节点指向None,表示链表的结束。

单链表的结构

每个节点的结构通常如下:

+---------+------+
|  Data   | Next |
+---------+------+
  • Data:存储节点的数据。
  • Next:指向下一个节点的指针。

创建单链表

定义节点类

首先,需要定义一个节点类,用于表示单链表中的节点。

class Node:
    def __init__(self, data=None):
        self.data = data
        self.next = None

在这个示例中,Node 类包含两个属性:data 用于存储节点的数据,next 用于存储指向下一个节点的指针。

定义链表类

接下来,定义一个链表类,用于管理节点的操作,如插入、删除和遍历等。

class LinkedList:
    def __init__(self):
        self.head = None

在这个示例中,LinkedList 类包含一个属性:head,用于存储链表的头节点。

基本操作

插入操作

插入操作用于将新节点添加到链表中。可以在链表的头部、尾部或指定位置插入新节点。

在头部插入

class LinkedList:
    def __init__(self):
        self.head = None

    def insert_at_head(self, data):
        new_node = Node(data)
        new_node.next = self.head
        self.head = new_node

在这个示例中,insert_at_head 方法创建一个新节点,并将其插入到链表的头部。

在尾部插入

class LinkedList:
    def __init__(self):
        self.head = None

    def insert_at_tail(self, data):
        new_node = Node(data)
        if self.head is None:
            self.head = new_node
            return
        last = self.head
        while last.next:
            last = last.next
        last.next = new_node

在这个示例中,insert_at_tail 方法创建一个新节点,并将其插入到链表的尾部。

删除操作

删除操作用于从链表中移除指定节点。可以删除头节点、尾节点或任意位置的节点。

删除头节点

class LinkedList:
    def __init__(self):
        self.head = None

    def delete_head(self):
        if self.head is None:
            return
        self.head = self.head.next

在这个示例中,delete_head 方法删除链表的头节点。

删除指定节点

class LinkedList:
    def __init__(self):
        self.head = None

    def delete_node(self, key):
        temp = self.head
        if temp is not None:
            if temp.data == key:
                self.head = temp.next
                temp = None
                return
        while temp is not None:
            if temp.data == key:
                break
            prev = temp
            temp = temp.next
        if temp == None:
            return
        prev.next = temp.next
        temp = None

在这个示例中,delete_node 方法删除包含指定数据的节点。

遍历操作

遍历操作用于访问链表中的每个节点,并进行相应的操作。

打印链表

class LinkedList:
    def __init__(self):
        self.head = None

    def print_list(self):
        temp = self.head
        while temp:
            print(temp.data, end=" ")
            temp = temp.next
        print()

在这个示例中,print_list 方法遍历链表并打印每个节点的数据。

查找操作

查找操作用于在链表中查找包含指定数据的节点。

查找指定节点

class LinkedList:
    def __init__(self):
        self.head = None

    def search(self, key):
        temp = self.head
        while temp:
            if temp.data == key:
                return True
            temp = temp.next
        return False

在这个示例中,search 方法在链表中查找包含指定数据的节点,如果找到则返回 True,否则返回 False

完整的单链表类

下面是一个完整的单链表类,包括插入、删除、遍历和查找操作的实现。

class Node:
    def __init__(self, data=None):
        self.data = data
        self.next = None

class LinkedList:
    def __init__(self):
        self.head = None

    def insert_at_head(self, data):
        new_node = Node(data)
        new_node.next = self.head
        self.head = new_node

    def insert_at_tail(self, data):
        new_node = Node(data)
        if self.head is None:
            self.head = new_node
            return
        last = self.head
        while last.next:
            last = last.next
        last.next = new_node

    def delete_head(self):
        if self.head is None:
            return
        self.head = self.head.next

    def delete_node(self, key):
        temp = self.head
        if temp is not None:
            if temp.data == key:
                self.head = temp.next
                temp = None
                return
        while temp is not None:
            if temp.data == key:
                break
            prev = temp
            temp = temp.next
        if temp == None:
            return
        prev.next = temp.next
        temp = None

    def print_list(self):
        temp = self.head
        while temp:
            print(temp.data, end=" ")
            temp = temp.next
        print()

    def search(self, key):
        temp = self.head
        while temp:
            if temp.data == key:
                return True
            temp = temp.next
        return False

# 使用示例
if __name__ == "__main__":
    ll = LinkedList()
    ll.insert_at_head(3)
    ll.insert_at_head(2)
    ll.insert_at_head(1)
    ll.insert_at_tail(4)
    ll.insert_at_tail(5)

    print("链表内容:")
    ll.print_list()  # 输出:1 2 3 4 5

    ll.delete_head()
    print("删除头节点后:")
    ll.print_list()  # 输出:2 3 4 5

    ll.delete_node(3)
    print("删除节点3后:")
    ll.print_list()  # 输出:2 4 5

    print("查找节点4:", ll.search(4))  # 输出:True
    print("查找节点6:", ll.search(6))  # 输出:False

总结

本文详细介绍了如何在Python中创建单链表,包括定义节点类和链表类,并实现插入、删除、遍历和查找操作。通过具体的示例代码,展示了如何使用这些操作来管理和操作链表数据结构。单链表是一种基础而重要的数据结构,掌握它可以帮助你在日常开发中更高效地处理各种数据管理任务。本文不仅涵盖了基本的链表操作,还提供了实际应用场景的示例,旨在帮助大家全面理解和应用单链表。


涛哥聊Python
59 声望37 粉丝