反转链表详解(Python)

本文详细介绍了一种高效的链表反转算法,通过三个指针leftPointer、midPointer和rightPointer的巧妙运用,实现链表的就地反转,避免了传统方法中O(n^2)的时间复杂度问题,最终返回反转后链表的头节点。

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

题目描述

  • 输入一个链表,反转链表后,输出新链表的表头

分析:

先随便表画一个链表:
在这里插入图片描述
这个是反转后的链表,也是我们想要的:
在这里插入图片描述

  • 由于链表查找元素只能从头节点开始,我们可以想到,挨个挨个的将元素的指针指向前一个元素

  • 如果链表的长度趋于无穷大,每一次反转,将会是O(n)的复杂度,所以的总的复杂度是O(n^2).

  • 这种方法时间复杂度太高!看下面的解法

解法详解:

通过循环来解决问题:

  • (1)先定义三个指针:leftPointer、midPointer、rightPointer分别指向第一、第二、第三个节点;
    在这里插入图片描述
  • (2)让leftPointer指向空(是反转链表的尾节点):
    在这里插入图片描述
  • (3)midPointer指向leftPointer:
    在这里插入图片描述
  • (4)将三个指针同时向后移一位:
    在这里插入图片描述
  • (5)midPointer指向leftPointer(和第3步一样):
    在这里插入图片描述
  • (6)将三个指针同时向后移一位(和第4步一样):
    在这里插入图片描述
  • (7)midPointer指向leftPointer(和第3步、第5步一样):
    在这里插入图片描述
  • (8)反转链表完成,这时midPointer指针指向的就是反转链表的表头了;

边界条件:

  • (1)一般的情况就是上面的步骤
  • (2)头节点为None,则直接返回None
    在这里插入图片描述
  • (3)头节点指向None,反转后还是这样子,则直接返回头节点
    在这里插入图片描述

详细代码(Python):

# class ListNode:
#     def __init__(self, x):   # 定义链表结构
#         self.val = x
#         self.next = None
class Solution:
    # 返回ListNode
    def ReverseList(self, pHead):     # pHead是初始链表的头节点
   
        if pHead == None:        # 若头节点为空,则直接返回None,(边界2)
            return None
        if pHead.next == None:    # 若头节点指向空,则直接返回头节点(边界3)
            return pHead
        
        # 定义三个指针leftPointer、midPointer、rightPointer
        leftPointer = pHead          # leftPointer指向头节点 (步骤1)
        midPointer = pHead.next         # midPointer指向头节点的下一个节点(步骤1)
        rightPointer = midPointer.next     # rightPointer指向下下一个节点(步骤1)
        leftPointer.next = None     # 先令leftPointer,即头节点,指向空(步骤2)
        
        while rightPointer != None:     # 若指针rightPointer指向不为空,则一直遍历下去
            midPointer.next = leftPointer     # midPointer指向前一个节点(步骤3、5)
            leftPointer = midPointer        # leftPointer指针像后移动一位,到midPointer(步骤4、6)
            midPointer = rightPointer    # midPointer指针像后移动一位,到rightPointer(步骤4、6)
            rightPointer = rightPointer.next   # rightPointer指针同样向后移动一位(步骤4、6)
        
        # 循环完成后,rightPointer是指向None的,这时到达步骤6,如图很明显还没完
        midPointer.next = leftPointer    # 将midPointer的next指向前一个节点,(步骤7)
        return midPointer     # midPointer就是新的链表的表头了
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值