Python数据结构之翻转链表

对于“Python数据结构之翻转链表”的完整攻略,我会按照以下顺序进行讲解:

1.什么是链表?

2.如何翻转链表?

3.示例1:翻转一个简单的链表

4.示例2:翻转一个带环的链表

5.如何在Python中实现翻转链表?

接下来,我会详细讲解每个部分。

什么是链表?

链表是一种数据结构,它由一系列的节点组成,每个节点包含了数据和指向下一个节点的指针。链表有很多种类型,包括单向链表、双向链表和循环链表等。链表相比于数组,有其自身的优势和劣势,我们可以在具体使用的时候选择不同的数据结构。

如何翻转链表?

翻转链表是指将链表中的节点按照相反的顺序重新排列,比如如果原先的链表是1-2-3-4-5,那么翻转后的链表就是5-4-3-2-1。

翻转链表的基本思路是遍历链表并将各个节点的指针反转。具体来说,我们可以设置三个指针prev,curr和next,初始化时,prev指向None,curr指向链表的头节点,next指向curr的下一个节点。然后,我们需要在循环中对curr节点的指针进行反转,即将该节点的next指针指向prev,同时更新prev、curr和next指针。最后,返回prev指针,即新链表的头节点。

示例1:翻转一个简单的链表

假设我们有一个简单的链表:1-2-3-4-5。我们可以使用如下代码翻转该链表:

class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next

def reverseList(head: ListNode) -> ListNode:
    prev = None
    curr = head
    while curr:
        next_node = curr.next
        curr.next = prev
        prev = curr
        curr = next_node
    return prev

# 创建链表
head = ListNode(1)
node1 = ListNode(2)
node2 = ListNode(3)
node3 = ListNode(4)
node4 = ListNode(5)
head.next = node1
node1.next = node2
node2.next = node3
node3.next = node4

# 输出原链表
curr = head
while curr:
    print(curr.val, end=" ")
    curr = curr.next
# 输出:1 2 3 4 5

# 翻转链表
new_head = reverseList(head)

# 输出新链表
curr = new_head
while curr:
    print(curr.val, end=" ")
    curr = curr.next
# 输出:5 4 3 2 1

示例2:翻转一个带环的链表

接下来,我们考虑一个较为复杂的情况,我们在链表中加入一个环,其中一部分节点形成环。比如链表是1-2-3-4-5,并且节点3和节点5形成了环路,即节点5的next指针指向节点3。

我们可以使用以下代码实现该功能:

# 创建带环的链表
head = ListNode(1)
node1 = ListNode(2)
node2 = ListNode(3)
node3 = ListNode(4)
node4 = ListNode(5)
head.next = node1
node1.next = node2
node2.next = node3
node3.next = node4
node4.next = node2  # 添加环

# 输出原链表
curr = head
for i in range(10):
    print(curr.val, end=" ")
    curr = curr.next
# 输出:1 2 3 4 5 3 4 5 3 4

# 翻转链表
new_head = reverseList(head)

# 输出新链表
curr = new_head
for i in range(10):
    print(curr.val, end=" ")
    curr = curr.next
# 输出:4 3 2 1 5 3 4 5 3 4

从上面的代码可以看出,翻转链表的函数能够正确处理带环的链表,而且在翻转后仍然能够保留原来的环路。

如何在Python中实现翻转链表?

现在,我们将翻转链表的代码封装到一个函数中。同时,我们也需要实现一个函数用来创建链表。具体如下:

class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next

def createList(vals: List[int]) -> ListNode:
    # 创建链表
    head = ListNode(vals[0])
    curr = head
    for val in vals[1:]:
        curr.next = ListNode(val)
        curr = curr.next
    return head

def reverseList(head: ListNode) -> ListNode:
    prev = None
    curr = head
    while curr:
        next_node = curr.next
        curr.next = prev
        prev = curr
        curr = next_node
    return prev

现在,我们就可以使用这些函数对任意的链表进行翻转了,比如:

# 创建链表
head = createList([1, 2, 3, 4, 5])

# 输出原链表
curr = head
while curr:
    print(curr.val, end=" ")
    curr = curr.next
# 输出:1 2 3 4 5

# 翻转链表
new_head = reverseList(head)

# 输出新链表
curr = new_head
while curr:
    print(curr.val, end=" ")
    curr = curr.next
# 输出:5 4 3 2 1

总之,翻转链表是一个常见的面试问题,掌握该问题的解决方法对于编程人员具有非常重要的意义。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python数据结构之翻转链表 - Python技术站

(1)
上一篇 2023年5月17日
下一篇 2023年5月17日

相关文章

  • PHP常用算法和数据结构示例(必看篇)

    PHP常用算法和数据结构示例(必看篇)攻略 在这篇文章中,我们将会学习一些PHP常用的算法和数据结构,并通过一些示例来说明它们的应用场景和使用方法。 1. 哈希表 哈希表是一种常用的数据结构,它根据关键码值(Key Value)而直接进行访问的数据结构。哈希表通常用于实现关联数组。PHP中提供了内置的哈希表数据结构Map和Array。 1.1 使用Map实现…

    数据结构 2023年5月17日
    00
  • C++数据结构之文件压缩(哈夫曼树)实例详解

    我来为您详细讲解一下“C++数据结构之文件压缩(哈夫曼树)实例详解”这篇文章的完整攻略: 文章基本信息 标题:C++数据结构之文件压缩(哈夫曼树)实例详解 作者:Coder_XWG 发布时间:2019年12月24日 文章概述 该篇文章主要讲解了哈夫曼树在文件压缩方面的应用。通过实例讲解了如何使用哈夫曼编码将文件进行压缩,以及如何解压缩被压缩的文件,并对文章中…

    数据结构 2023年5月17日
    00
  • 第14届蓝桥杯C++B组省赛题解(A-J)(更新完毕)

    目录 A. 日期统计 题目内容 思路 代码 答案 B.01 串的熵 题目内容 思路 代码 答案 C.冶炼金属 题目内容 输入格式 输出格式 输入样例 输出样例 思路 代码 D.飞机降落 题目内容 输入格式 输出格式 输入样例 输出样例 思路 代码 E.接龙数列 题目内容 输入格式 输出格式 输入样例 输出样例 思路 代码 F.岛屿数量 题目内容 输入格式 输…

    算法与数据结构 2023年4月25日
    00
  • Leetcode Practice — 字符串

    目录 14. 最长公共前缀 思路解析 151. 反转字符串中的单词 思路解析 125. 验证回文串 思路解析 415. 字符串相加 思路解析 3. 无重复字符的最长子串 思路解析 8. 字符串转换整数 (atoi) 思路解析 14. 最长公共前缀 编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀,返回空字符串 “”。 输入:strs = […

    算法与数据结构 2023年4月18日
    00
  • python数据结构之二叉树的统计与转换实例

    下面是针对“python数据结构之二叉树的统计与转换实例”的详细讲解攻略: 什么是二叉树 二叉树指的是一种树状结构,具有如下特点: 每个节点最多有两个子节点,分别为左子节点和右子节点 左子节点的值比父节点小,右子节点的值比父节点大 二叉树可以是空树,也可以是非空树。 二叉树的遍历 在对二叉树进行操作时,需要对其节点进行遍历。二叉树的遍历方式一般有以下三种: …

    数据结构 2023年5月17日
    00
  • Java数据结构最清晰图解二叉树前 中 后序遍历

    Java数据结构最清晰图解二叉树前 中 后序遍历 前言 二叉树是数据结构中至关重要的一种数据结构,对于计算机科学的学习和工作都是至关重要的。而遍历二叉树是二叉树的重要操作之一。 为了帮助读者更好地理解二叉树前、中、后序遍历的过程,本文介绍 Java 数据结构中最清晰的图解二叉树前、中、后序遍历攻略。 什么是二叉树? 二叉树是一种非常重要的数据结构,它由根节点…

    数据结构 2023年5月17日
    00
  • Java数据结构之实现跳表

    Java数据结构之实现跳表,是一篇对跳表数据结构的详细讲解。 背景 跳表是一种基于有序链表的高效查找算法,它的查找时间复杂度为O(logn),相比于普通链表的O(n),具有很大的优势。本文将介绍跳表的实现过程。 实现跳表 1. 跳表结构体 跳表的数据结构体实现包含以下四项: 头结点head:表示链表的起始位置。 节点Node:跳表中的节点,包含表层链表和下层…

    数据结构 2023年5月17日
    00
  • 「学习笔记」AC 自动机

    「学习笔记」AC 自动机 点击查看目录 目录 「学习笔记」AC 自动机 算法 问题 思路 代码 例题 Keywords Search 玄武密码 单词 病毒 最短母串 文本生成器 背单词 密码 禁忌 前置:「学习笔记」字符串基础:Hash,KMP与Trie。 好像对例题的讲解越来越抽象了? 算法 问题 求 \(n\) 个单词在一个长度为 \(m\) 的文章里出…

    算法与数据结构 2023年5月5日
    00
合作推广
合作推广
分享本页
返回顶部