美文网首页
Python编程题44--反转链表

Python编程题44--反转链表

作者: wintests | 来源:发表于2022-01-16 11:38 被阅读0次

题目

给定一个单链表的头节点 head ,请实现反转链表,并返回反转后的链表。

例如:

原链表转换为列表:[1, 2, 3, 4, 5]
最终的链表转换为列表:[5, 4, 3, 2, 1]

原链表转换为列表:[1, 2]
最终的链表转换为列表:[2, 1]

原链表转换为列表:[]
最终的链表转换为列表:[]

已知 链表节点的定义、链表与列表相互转换 的代码如下:

class ListNode:  # 单链表
    def __init__(self, val=0, next=None):
        self.val = val  # 链表节点上存储的元素
        self.next = next  # 指向下一个链表节点


def list_to_list_node(numbers):  # 将列表转换为单向链表,并返回链表的头节点
    dummy_head = ListNode(0)
    pre = dummy_head
    for number in numbers:
        pre.next = ListNode(number)
        pre = pre.next
    pre = dummy_head.next
    return pre


def list_node_to_list(node):  # 将单向链表转换为列表
    result = []
    while node:
        result.append(node.val)
        node = node.next
    return result

实现思路

  • 设置两个指针:cur、pre,分别指向当前节点和前一个节点,cur默认指向链表头节点head,pre默认为None
  • 当 cur 非空时进行循环,我们要实现链表的反转,只需要在每次循环过程中让 cur 指向 pre ,这样操作下来就能让当前节点指向其前一个节点
  • 循环结束后得到的就是反转后的链表,注意此时 pre 指向原链表中的最后一个节点,我们只需要把 pre 返回即可

代码实现--迭代

class Solution:
    def reverseList(self, head: ListNode) -> ListNode:
        cur = head  # 当前节点
        pre = None  # 前一个节点
        while cur is not None:
            tmp_node = cur.next  # 临时保存当前节点的下一个节点 cur.next , 下一步要改变 cur.next
            cur.next = pre  # 反转, 当前节点通过 next 指向前一个节点
            pre = cur  # 将前一个节点变为当前节点
            cur = tmp_node  # 将当前节点变为保存的临时节点
        return pre

上面代码中使用了一个中间变量 tmp_node ,其实我们可以直接利用Python的多元赋值来完成,从而使代码更加简洁。优化如下:

class Solution:
    def reverseList(self, head: ListNode) -> ListNode:
        cur, pre = head, None  # 当前节点,前一个节点
        while cur is not None:
            # 当前节点通过 next 指向前一个节点,将前一个节点变为当前节点,将当前节点变为下一个节点
            cur.next, pre, cur = pre, cur, cur.next
        return pre

代码实现--递归

class Solution:
    def reverseList(self, head: ListNode) -> ListNode:
        return self.reverse_recursive(None, head)

    def reverse_recursive(self, pre: ListNode, cur: ListNode) -> ListNode:
        if cur is None:
            return pre
        tmp_node = cur.next  # 临时保存当前节点的下一个节点 cur.next , 下一步要改变 cur.next
        cur.next = pre  # 反转,当前节点通过 next 指向前一个节点
        return self.reverse_recursive(cur, tmp_node)

更多Python编程题,等你来挑战:Python编程题汇总(持续更新中……)

相关文章

  • Python编程题44--反转链表

    题目 给定一个单链表的头节点 head ,请实现反转链表,并返回反转后的链表。 例如:原链表转换为列表:[1, 2...

  • leetcode链表之反转链表

    本文主要有三道题,都是关于反转链表的算法题,由浅入深。文章出现的代码都是python3 206、反转链表[http...

  • Python小白 Leetcode刷题历程 No.91-N

    Python小白 Leetcode刷题历程 No.91-No.95 解码方法、反转链表Ⅱ、复原IP地址...

  • leecode刷题(22)-- 反转链表

    leecode刷题(22)-- 反转链表 反转数组 反转一个单链表。 示例: 进阶:你可以迭代或递归地反转链表。你...

  • Python实现双向链表

    Python实现双向链表的增删改查,反转链表

  • 2019/10/27 链表反转 (递归)

    反转链表 反转链表为 leetcode 206题: 反转一个单链表。示例: 输入: 1->2->3->4->5->...

  • Java、Python3 实战 LeetCode 高频面试之单链

    单链表反转 单链表反转这道题可谓是链表里面的高频问题了,差不多可以说只要被问到链表,就会问单链表反转。 今天我们就...

  • 链表常见问题

    反转单向链表思路使用一个临时节点当做缓冲节点,通过绕圈完成反转 反转部分链表题:给定一个链表,及反转的范围,完成反...

  • 算法学习:链表反转

    题目1: 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 递归解法: 迭代解法: 题目2: 题...

  • Swift 反转链表 - LeetCode

    题目: 反转链表 反转一个单链表。示例: 进阶:你可以迭代或递归地反转链表。你能否用两种方法解决这道题? 方案一...

网友评论

      本文标题:Python编程题44--反转链表

      本文链接:https://www.haomeiwen.com/subject/xgiucrtx.html