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

链表内指定区间反转

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:
        # 创建一个哑节点,这可以帮助简化插入节点等操作,特别是在链表头部处理时
        dummy_head = ListNode(-1)
        # 将哑节点指向原链表的头部,这样我们就不会丢失头节点的引用
        dummy_head.next = head

        # 使用一个指针从哑节点开始遍历链表,直到达到翻转部分的前一个节点
        pointer = dummy_head
        for i in range(m-1):
            pointer = pointer.next

        # 'reverse_pre'将作为反转部分的前一个节点
        reverse_pre = pointer
        # 'reverse_tail'将是反转部分的第一个节点,翻转后将成为尾部
        reverse_tail = pointer.next

        # 'pre'将跟踪我们即将翻转的节点的前一个节点
        # 'cur'是当前要翻转的节点
        pre = pointer.next
        cur = pre.next

        # 进行翻转操作直到达到指定的位置n
        while m < n:
            # 'temp'用来暂存'cur'的下一个节点,因为翻转过程中会丢失原有的next引用
            temp = cur.next
            # 将'cur'的next指向'pre'来实现翻转
            cur.next = pre
            # 'pre'和'cur'都前进一个节点
            pre = cur
            cur = temp
            # 我们已经处理了一个节点,所以减少n
            m += 1
        
        # 经过上面的循环,翻转部分已经完成,现在将翻转部分前面的节点连接到翻转后的头部
        reverse_pre.next = pre
        # 将翻转部分后的尾部连接到剩余未翻转部分的头部
        reverse_tail.next = cur

        # 因为我们使用了哑节点,所以返回哑节点的next,即原链表的头部
        return dummy_head.next

全部评论

相关推荐

尊嘟假嘟点击就送:加v细说,问题很大
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务