LeetCode 92 Reverse Linked List II (Python详解及实现)

【题目】

Reverse a linked list from position m to n.Do it in-place and in one-pass.

 

For example:

Given 1->2->3->4->5->NULL, m= 2 and n = 4,

 

return 1->4->3->2->5->NULL.

 

Note:

Given m, n satisfy the following condition:

1 ≤ m ≤ n ≤ length of list.

 

 

【思路】

定义指针关注是否到m和n的位置,到达后m后将链表断开成左右两部分A、B,继续移动到达n时将链表分成两部分B、C,这样可以提取出m,n段即B部分,然后将B部分反转后,与AC重新连接即可。

例1->2->3->4->5->NULL过程:

l  初始状态

#     0 ----> 1 ----> 2 ----> 3 ----> 4 ----> 5

#     prev  curr

l  第一个while循环(m=2,n=4)执行完状态:

       #      0 ----> 1 ----> 2 ---->3 ----> 4 ----> 5

       #          prev  curr

l  执行last_unswapped,first_swapped = prev, curr,开始断开的结点m前一个点

         #      0 -------> 1 ----------------------->2 ------------------------> 3 ----> 4 ----> 5

    #          last_unswapped   first_swapped

l  第二个while循环(m=2,n=4)执行状态:

        # diff=2 #  1 <-- 2     3 ----> 4 ---->5

       #                  prev curr

       # diff=1 #   1 <-- 2 <--3     4 ----> 5

       #                       prev  curr

       # diff=0 #   1 <-- 2 <-- 3<-- 4     5

       #                           prev  curr

l  执行last_unswapped.next= prev,first_swapped.next  = curr,结束断开的结点n后的点。执行上main两条语句后状态:


【Python实现】

# -*- coding: utf-8 -*-
"""
Created on Thu Aug 10 10:18:04 2017

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

class Solution(object):
    def reverseBetween(self, head, m, n):
        """
        :type head: ListNode
        :type m: int
        :type n: int
        :rtype: ListNode
        """
        dummy, partial_len = ListNode(0), n - m
        dummy.next = head
        prev, curr = dummy, dummy.next
        #取出mn之间的结点,并反转
        while m > 1:#pre是开始反转的结点
            prev, curr = curr, curr.next
            m -= 1
        last_unswapped, first_swapped = prev, curr
        while curr and partial_len >= 0:#pre是结束反转的结点
            curr.next, prev, curr = prev, curr, curr.next
            partial_len -= 1
        #重新连接结点
        last_unswapped.next, first_swapped.next = prev, curr
        return dummy.next
    
    
if __name__ == '__main__':
    S = Solution()
    l1 = ListNode(1)
    l2 = ListNode(2)
    l3 = ListNode(3)
    l4 = ListNode(4)
    l5 = ListNode(5)
    head = l1
    l1.next = l2
    l2.next = l3
    l3.next = l4
    l4.next = l5
    l5.next = None
    S.partition(head,2,4)    
          


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值