Leetcode206--反转链表

本文详细介绍了如何使用 Python 实现 LeetCode 上的 206 题目——反转链表。提供了迭代和递归两种方法,并附带完整的代码示例,帮助读者理解链表的基本操作及其实现细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Leetcode206–反转链表

反转一个单链表

编程语言:python

作者:黑暗主宰

邮箱:shengzhanhe@gmail.com

Leetcode206–反转链表

题目描述

原题链接:

​ https://leetcode-cn.com/problems/reverse-linked-list/ (中文)

​ https://leetcode.com/problems/reverse-linked-list/ (英文)

题目描述:

​ 反转一个单链表。

说明:

  你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?

示例 1:
  输入: 1->2->3->4->5->NULL
  输出: 5->4->3->2->1->NULL

解题思路

链表是一种物理存储单元存储单元上非连续、非顺序的存储结构,所以不能直接像数组那样直接通过索引获取数组,需要根据前一个节点去知道下一个节点的位置。

在这里插入图片描述

所以我们要反转整个链表就是通过下面的方法,逐个的断开每一个节点并指向前一个节点:

在这里插入图片描述

这里就先建立一个节点类,对于一个单链表而言,一个节点应该包含存储链表元素的变量和用来存放下一个节点位置的变量,代码如下:

class LinkNode(object):
    def __init__(self, elem=None):
        self.elem = elem
        self.next = None

然后为了简单起见,直接通过上面的节点,手动的建立一个单链表,重点放在反转链表上

n1 = LinkNode(1)
n2 = LinkNode(2)
n3 = LinkNode(3)
n4 = LinkNode(4)
n5 = LinkNode(5)
n1.next = n2
n2.next = n3
n3.next = n4
n4.next = n5

上面的单链表是n1为头节点,n5为未节点

然后按照上面的图解,通过迭代和递归两种方法来反转链表

class LinkList(object):
    def ReverseList(self, pHead):
        pReversedHead = None
        pNode = pHead
        pPrev = None
        
        while pNode:
            pNext = pNode.next
            if not pNext:
                pReversedHead = pNode
            pNode.next = pPrev
            pPrev = pNode
            pNode = pNext
        #return pReversedHead
    
    #递归
    def ReverseListRec(self, pHead):
        if not pHead or not pHead.next:
            return pHead
        else:
            pReversedHead = self.ReverseListRec(pHead.next)
            pHead.next.next = pHead
            pHead.next = None
            #return pReversedHead

通过下面的代码,验证一下是不是正确:

def travel(head):
    if not head:
        return
    cur = head
    while cur:
        print(cur.elem, end = ' ')
        cur = cur.next
    print()
print("---------反转前-----------")
travel(n1)
l = LinkList()
#print(l.ReverseList(n1).elem)
l.ReverseListRec(n1)
print("---------反转后-----------")
travel(n5)

Leetcode提交的版本:

# Definition for singly-linked list.
# class ListNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution(object):
    def reverseList(self, head):
        """
        :type head: ListNode
        :rtype: ListNode
        """
        
        pReversedHead = None
        pNode = head
        pPre = None
        while pNode:
            pNext = pNode.next
            if not pNext:
                pReversedHead = pNode
            pNode.next = pPre
            pPre = pNode
            pNode = pNext
        return pReversedHead

欢迎大家关注我的个人公众号,同样的也是和该博客账号一样,专注分享技术问题,我们一起学习进步
在这里插入图片描述

注: 文中有写错的地方,欢迎大家不吝指正!!!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值