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日

相关文章

  • C语言顺序表的基本结构与实现思路详解

    C语言顺序表的基本结构与实现思路详解 什么是顺序表 顺序表,顾名思义,就是使用连续的存储空间来存储数据元素的线性表。在顺序表中,每一个数据元素都占用一个连续的存储单元,这些存储单元在物理上连续存放,因此,顺序表实际上就是由一个存储数据元素的数组和记录该数组大小的变量组成的。 顺序表的基本结构 顺序表的定义 “`c #define MAXSIZE 100 /…

    数据结构 2023年5月17日
    00
  • MySQL索引底层数据结构详情

    MySQL索引底层数据结构详情 MySQL是一种关系型数据库,在设计和使用表时,常常需要使用索引来提高数据库的查询效率。那么,这些索引究竟是如何工作的呢?本文将介绍MySQL索引的底层数据结构,并提供两个示例以帮助读者更好地理解。 索引是什么? 索引是数据库中一种特殊的数据结构,用于加速查询操作。在MySQL中,通常使用B+Tree作为索引的底层数据结构。 …

    数据结构 2023年5月17日
    00
  • 题目 3158: 蓝桥杯2023年第十四届省赛真题-三国游戏(贪心)

    题目描述 小蓝正在玩一款游戏。游戏中魏蜀吴三个国家各自拥有一定数量的士兵X, Y, Z (一开始可以认为都为 0 )。游戏有 n 个可能会发生的事件,每个事件之间相互独立且最多只会发生一次,当第 i 个事件发生时会分别让 X, Y, Z 增加Ai , Bi ,Ci 。当游戏结束时 (所有事件的发生与否已经确定),如果 X, Y, Z 的其中一个大于另外两个之…

    算法与数据结构 2023年4月30日
    00
  • 二叉搜索树的本质

    引言 打算写写树形数据结构:二叉查找树、红黑树、跳表和 B 树。这些数据结构都是为了解决同一个基本问题:如何快速地对一个大集合执行增删改查。 本篇是第一篇,讲讲搜索树的基础:二叉搜索树。 基本问题 如何在一千万个手机号中快速找到 13012345432 这个号(以及相关联信息,如号主姓名)? 最笨的方案 把一千万个手机号从头到尾遍历一遍,直到找到该手机号,返…

    算法与数据结构 2023年4月17日
    00
  • C语言编程数据结构的栈和队列

    C语言编程数据结构的栈和队列 什么是栈 栈(Stack) 是限定仅在表尾进行插入和删除操作的线性表。栈也称为后进先出( Last In First Out)的线性表,简称 LIFO 结构。栈结构有两个最重要的操作:入栈和出栈。其中,入栈操作向栈中添加一个元素,出栈操作从栈中删除一个元素。 栈的基本操作 初始化栈 入栈 出栈 取栈顶元素 判空 判满 // 栈的…

    数据结构 2023年5月17日
    00
  • C#数据结构揭秘一

    C#数据结构揭秘一攻略 C#数据结构是每个C#程序员必须熟练掌握的技能之一。本攻略将介绍常见的C#数据结构,包括数组、列表、栈、队列、散列表和字典。我们将会深入了解它们的特点、使用场景和使用方法,并附带代码示例加深理解。 数组 数组是存储单一类型元素的固定大小的集合结构。在C#中,可以使用以下方式声明和初始化一个数组: int[] nums1 = new i…

    数据结构 2023年5月17日
    00
  • Halcon软件安装与界面简介

      1. 下载Halcon17版本到到本地 2. 双击安装包后 3. 步骤如下     界面分为四大块 1.    Halcon的五个助手 1)    图像采集助手:与相机连接,设定相机参数,采集图像 2)    标定助手:九点标定或是其它的标定,生成标定文件及内参外参,可以将像素单位转换为长度单位 3)    模板匹配助手:画取你想寻找的图像,设定参数,可…

    算法与数据结构 2023年4月19日
    00
  • 「学习笔记」AC 自动机

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

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