python单向链表实例详解

下面是关于“Python单向链表实例详解”的完整攻略:

什么是单向链表?

单向链表(Singly Linked List)是一种常见的数据结构,它由多个节点组成,每个节点包含一个数据元素和一个指向下一个节点的指针。相比于数组,单向链表具有动态操作、空间灵活等优势,在实际应用中也很常见。

如何实现单向链表?

在 Python 中,我们可以用类来定义一个单向链表,每个节点用一个类实例来表示。以下是一个最简单的示例:

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

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

在这里,我们定义了一个 Node 类,包含数据域 data 和指针域 next;同时,我们定义了一个 LinkedList 类,初始时链表为空,头结点指针为空。

单向链表的基本操作

1. 添加元素

向链表中添加元素时,我们需要创建一个新的节点,然后将它插入到链表的末尾。以下是一个示例:

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

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

在这里,我们定义了一个 append 方法,用于将新元素添加到链表末尾。首先,我们创建一个新的节点 new_node,其数据域为 data;然后,我们检查链表是否为空,如果是,则将 new_node 设置为头结点;否则,用 last_node 变量指向链表的最后一个节点,然后将 new_node 插入到链表的末尾。

2. 遍历链表

遍历链表时,我们只需要从头节点开始依次访问每个节点即可。以下是一个示例:

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

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

    def traverse(self):
        if self.head is None:
            print("List is empty")
            return
        current_node = self.head
        while current_node:
            print(current_node.data, end=" ")
            current_node = current_node.next

在这里,我们定义了一个 traverse 方法,用于遍历链表并输出每个节点的数据域。首先,我们检查链表是否为空,如果是,则输出 “List is empty” ;否则,我们用 current_node 变量指向链表的头结点,然后依次访问每个节点并输出其数据域。

以下是一个示例输出:

linked_list = LinkedList()
linked_list.append("A")
linked_list.append("B")
linked_list.append("C")

linked_list.traverse()
# Output: A B C

可以看到,我们成功地创建并遍历了一个包含 3 个元素的链表。

示例应用

1. 单向链表中的常见问题:查找中间节点

对于链表中除了头尾节点以外的其他节点,我们可以用以下方法来查找其中间节点:

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

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

    def find_middle_node(self):
        if self.head is None:
            return None
        slow_pointer = self.head
        fast_pointer = self.head
        while fast_pointer and fast_pointer.next:
            slow_pointer = slow_pointer.next
            fast_pointer = fast_pointer.next.next
        return slow_pointer

在这里,我们定义了一个 find_middle_node 方法,用于查找链表的中间节点。首先,我们检查链表是否为空,如果是,则返回 None;否则,我们用 slow_pointer 和 fast_pointer 两个指针分别指向头结点,并进行以下操作:

  • 正常情况下,fast_pointer 走两步,slow_pointer 走一步,直到 fast_pointer 无法再走两步为止;
  • 最后,slow_pointer 指向的节点即为中间节点。

以下是一个示例输出:

linked_list = LinkedList()
linked_list.append("A")
linked_list.append("B")
linked_list.append("C")
linked_list.append("D")
linked_list.append("E")
linked_list.append("F")

middle_node = linked_list.find_middle_node()
print(middle_node.data)
# Output: D

2. 单向链表的反转

对于一个链表,我们可以用以下方法来反转它:

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

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

    def reverse(self):
        previous_node = None
        current_node = self.head
        while current_node:
            next_node = current_node.next
            current_node.next = previous_node
            previous_node = current_node
            current_node = next_node
        self.head = previous_node

在这里,我们定义了一个 reverse 方法,用于反转链表。首先,我们用 previous_node 变量指向 None,用 current_node 变量指向链表的头结点;然后,依次处理每个节点:

  • 将 current_node 的 next 指针指向 previous_node;
  • 将 previous_node 指向 current_node;
  • 将 current_node 指向 next_node。

最后,将 self.head 指向反转后的链表的第一个节点。

以下是一个示例输出:

linked_list = LinkedList()
linked_list.append("A")
linked_list.append("B")
linked_list.append("C")
linked_list.append("D")
linked_list.append("E")
linked_list.append("F")

print("Original list:")
linked_list.traverse()
# Output: A B C D E F

linked_list.reverse()

print("Reversed list:")
linked_list.traverse()
# Output: F E D C B A

可以看到,我们成功地反转了一个链表。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python单向链表实例详解 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • C语言入门之浮点数

    C语言入门之浮点数 什么是浮点数 在计算机中,浮点数是一种表示实数(即小数)的数据类型。与整数不同,浮点数的存储方式使用指数表示法,可以表示非常大或非常小的数值。在C语言中,浮点数类型为float或double,分别使用4字节或8字节的存储空间。 如何定义浮点数变量 在程序中定义浮点数变量的方法与定义整数变量类似,但需要使用浮点数类型的关键字float或do…

    other 2023年6月27日
    00
  • 解决vuex刷新状态初始化的方法实现

    下面就详细讲解一下“解决vuex刷新状态初始化的方法实现”的完整攻略: 1. 问题描述 在使用vuex管理状态时,由于状态信息存在于缓存中,页面刷新后状态依然存在,但是用户信息等无法从缓存中获取,因此需要对状态信息进行初始化操作。 2. 解决方法 2.1 在页面加载时初始化状态 在代码中的created生命周期中,在actions中调用函数初始化所需的状态信…

    other 2023年6月20日
    00
  • Win11如何打开程序和功能? Win11快速打开程序和功能的技巧

    当你在Windows 11操作系统中需要打开某个程序或者功能时,可以通过以下几种方式来实现: 通过开始菜单打开程序和功能 在Win11操作系统中,点击开始菜单旁边的搜索图标,然后在搜索框中输入你想打开的程序或者功能的名称,Win11会在下拉列表中显示所有符合条件的应用程序、设置和文件。直接点击搜索结果中的项即可打开。如果Win11没有自动显示你搜索的内容,也…

    other 2023年6月25日
    00
  • i5 9400F和i5 8400哪个值得买 Intel酷睿i5-9400F和8400区别对比

    i5 9400F和i5 8400的区别对比 1. 性能比较 i5 9400F 核心/线程数:6核心/6线程 基础频率:2.9 GHz 最大睿频:4.1 GHz 缓存:9 MB TDP:65W i5 8400 核心/线程数:6核心/6线程 基础频率:2.8 GHz 最大睿频:4.0 GHz 缓存:9 MB TDP:65W 从性能上来看,i5 9400F和i5 …

    other 2023年8月6日
    00
  • Android、iOS和Windows Phone中的推送技术详解

    Android、iOS和Windows Phone中的推送技术详解 什么是推送技术 推送技术是一种用于向移动设备推送消息和通知的技术。 通过推送技术,消息可以在后台发送到移动设备上的应用程序,而不需要用户手动打开应用程序以确认消息。 推送技术适用于广泛的移动应用程序,包括社交媒体,电子邮件,即时消息,天气,动态数据和其他基于位置的服务。 Android中的推…

    other 2023年6月27日
    00
  • C语言的函数概念与规则你了解吗

    当谈到编程语言时,函数是其中一个最重要的概念。在C语言中,函数的概念非常重要且广泛使用。在本文中,我们将详细解释C中函数的概念、规则以及怎样使用它们。 函数的概念 在程序编写中,一个函数是一些可被调用并且能执行一个特定任务的代码块。一个函数通常包括两部分:函数头和函数体。 函数头包含了函数名以及参数列表,参数列表可以为空。函数体是包含在花括号中的一系列语句。…

    other 2023年6月27日
    00
  • WindowsXP终极优化设置大全

    WindowsXP终极优化设置大全攻略 WindowsXP作为一个经典的操作系统,在使用中可能存在一些不足之处,但是通过一些优化设置可以提升其性能和体验。本文将详细介绍WindowsXP终极优化设置大全的完整攻略,包括以下内容: 系统设置优化 软件程序优化 硬件驱动优化 网络优化设置 系统设置优化 1. 关闭无用的服务和应用程序 WindowsXP系统启动时…

    other 2023年6月28日
    00
  • C语言顺序表的基本操作(初始化,插入,删除,查询,扩容,打印,清空等)

    下面是C语言顺序表的基本操作的完整攻略: 1. 初始化操作 初始化操作是顺序表的第一步,用于创建一个空的顺序表。 #include <stdio.h> #include <stdlib.h> #define MAXSIZE 10 // 定义顺序表的最大长度 typedef struct { int data[MAXSIZE]; // …

    other 2023年6月20日
    00
合作推广
合作推广
分享本页
返回顶部