Python数据结构之翻转链表

yizhihongxing

对于“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数据结构之双链表详细示例分析的完整攻略。 双链表简介与定义 双链表是链表的一种,在链表中每一个节点都有一个指针域,指向下一个节点,这个指针域称为next指针;而在双链表中每一个节点也有两个指针域,一个指向前驱节点,另一个指向后继节点,即prev指针与next指针。由于双链表存在两个指针域,因此它支持双向遍历,无论是正向还是…

    数据结构 2023年5月17日
    00
  • 一文带你走进js数据类型与数据结构的世界

    一文带你走进JS数据类型与数据结构的世界 一、JS数据类型 1. 原始类型 JS中原始类型包括:Undefined、Null、Boolean、Number、String、Symbol(ES6新增)。 其中Undefined和Null分别代表未定义和空值,Boolean表示布尔值,Number表示数字,String表示字符串,Symbol是ES6新增的一种基础…

    数据结构 2023年5月17日
    00
  • java数据结构基础:线性表

    Java数据结构基础:线性表 简介 线性表是指数据元素之间存在线性关系的数据结构,即数据元素之间有前后直接关系,且第一个元素没有前驱,最后一个元素没有后继。线性表可以用数组或者链表两种方式实现。 数组实现线性表 线性表的数组实现即为将线性表中的元素放在一个一维数组中,使用数组下标表示元素的位置。由于数组随机访问元素的时间复杂度为O(1),因此在随机访问比较多…

    数据结构 2023年5月17日
    00
  • 算法总结–ST表

    声明(叠甲):鄙人水平有限,本文为作者的学习总结,仅供参考。 1. RMQ 介绍 在开始介绍 ST 表前,我们先了解以下它以用的场景 RMQ问题 。RMQ (Range Minimum/Maximum Query)问题是指:对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j<=n),返回数列A中下标在i,j里的最小(大)值,也就是说,RMQ…

    算法与数据结构 2023年4月18日
    00
  • JavaScript树形数据结构处理

    对于“JavaScript树形数据结构处理”的完整攻略,我将从以下几个方面进行讲解: 树形数据结构的简介 树形数据结构在JavaScript中的表示 树形数据结构的处理方法 示例说明 树形数据结构的简介 树形数据结构,是一种常见的数据结构,由多个节点组成,每个节点有一个父节点和多个子节点。树形数据结构通常用来表示层级关系的数据。 树形数据结构在JavaScr…

    数据结构 2023年5月17日
    00
  • Go 语言数据结构之双链表学习教程

    Go 语言数据结构之双链表学习教程 一、前言 双链表是常见的数据结构,Go语言作为一种静态类型的语言,自带指针类型支持,因此在实现双链表时相对比较容易。本文中,我们将介绍双链表的基础理论和实践应用,并结合代码实现来详细讲解。 二、实现双链表的基本操作 1. 创建双链表 创建双链表需要定义链表中存储的元素类型,以及定义一个结构体来表示双链表中的一个节点。 ty…

    数据结构 2023年5月17日
    00
  • JavaScript数据结构Number

    JavaScript数据结构Number 简介 JavaScript中的Number是一种表示数字的数据类型,包括整数和浮点数。Number类型的值是不可变的。 数字类型(Number)的创建 数字类型可以通过直接赋值的方式创建,如: let num = 10; // 整数 let floatNum = 3.14; // 浮点数 另外,JavaScript还…

    数据结构 2023年5月17日
    00
  • C++ 数据结构超详细讲解单链表

    C++ 数据结构超详细讲解单链表 什么是单链表 单链表是一种常见的线性数据结构,它由若干个节点组成,每个节点包含两部分内容:数据域和指针域。其中数据域存储节点所携带的数据,而指针域存储下一个节点的地址。 单链表的性质在于每个节点只有一个指针域,而第一个节点叫做头节点,通常不存放数据,只用来标注链表的起始位置。最后一个节点的指针域指向 NULL,即表示链表的结…

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