题解 | #链表内指定区间反转#

链表内指定区间反转

https://www.nowcoder.com/practice/b58434e200a648c589ca2063f1faf58c

# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 
# @param head ListNode类 
# @param m int整型 
# @param n int整型 
# @return ListNode类
#
class Solution:
    def reverseBetween(self , head: ListNode, m: int, n: int) -> ListNode:
        # write code here
        if m==n or head ==None or head.next ==None:
            return head

        res = ListNode(-1)  #加表头,最终返回res.next
        res.next = head

        prev = res  #m前一个元素, 每次遍历只改变next指针,指向上次遍历p的下一跳
        p = head    #遍历指针,每次向前移动一位,到n后停止

        for _ in range(m-1): #找到m位置
            prev = p
            p = p.next

        for _ in range(m,n):
            temp = p.next   #保存当前p的下一跳
            p.next = temp.next  #p的下一跳变为原来下一跳的下一跳
            temp.next = prev.next   #原来p的下一跳(temp)指向p自己,实现反转
            prev.next = temp    #  prev的指针刷新为原先p的下一跳
        
        return res.next
'''
假设列表1~5,m=2,n=4,找到m后
prev:  1  ==>prev.next: 2 ==> prev.next.next: 3 ==> prev.next.next.next: 4
p:  2 p.next: 3

while遍历过程中
prev:  1  ==>prev.next: 3 ==> prev.next.next: 2 ==> prev.next.next,next: 4
p:  2 p.next: 4
while遍历过程中
prev:  1  ==>prev.next: 4 ==> prev.next.next: 3 ==> prev.next.next,next: 2
p:  2 p.next: 5
'''






            



全部评论

相关推荐

不愿透露姓名的神秘牛友
07-24 12:26
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-21 13:38
8月实习会变多吗现在还没找到实习该怎么办...回复的hr好少
码农索隆:3-4月就要开始找,基本上6月份就发offer,7月初已经开始暑期实习了。
点赞 评论 收藏
分享
05-29 20:34
门头沟学院 C++
KarlAllen:得做好直接春招的准备。学历差的话,一是面试要求会比学历好的严格不少,二是就算面试通过了也会被排序。总之暑期和秋招对于学历差的就是及其不友好
无实习如何秋招上岸
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务