翻转链表 II

来源:互联网 发布:天翼飞young跳过软件 编辑:程序博客网 时间:2024/06/18 07:40

题目描述:翻转链表中第m个节点到第n个节点的部分;注意事项:m,n满足1 ≤ m ≤ n ≤ 链表长度

样例:给出链表1->2->3->4->5->null, m = 2 和n = 4,返回1->4->3->2->5->null


之前,已经实现过普通的,对于整个链表的翻转(详见:点击打开链接),这里增加了一点难度,设置了翻转的位置。但是基本方法没变。难度主要在于“摘链”和“链接”的操作。

所以,我们不妨仿照之前“回文链表”(详见:点击打开链接)的解决方法,将链表断开,再处理。这是一种偷懒的方法,将问题难度降低了。

简单说,拿样例举例吧,可以先找到翻转的开始位置,这里是2,然后根据这个位置将链表断开:1->null, 2->3->4->5->null,这就形成了两个链表。

然后,将第二个链表依次取头结点,放在1的后面:

1. 1->2->null, 3->4->5->null

2. 1->3->2->null, 4->5->null

。。。

这样的循环进行几次呢,循环3次,也就是n - m + 1次

之后再将现在的两个链表合并即可。代码就可以得到了:

"""Definition of ListNodeclass ListNode(object):    def __init__(self, val, next=None):        self.val = val        self.next = next"""class Solution:    """    @param head: The head of linked list    @param m: start position    @param n: end position    """    def reverseBetween(self, head, m, n):        dummy = ListNode(-1)        dummy.next = head        pre = dummy        count = 1        # 找到要翻转部分的开始        while count != m:            pre = pre.next            count += 1        # gap为循环的次数        gap = n - m + 1        # 第二部分        second = pre.next        # 设置第一部分的尾节点,目的在于最后的合并        tail = second        pre.next = None        while gap != 0:            cur = second            second = second.next            temp = pre.next            pre.next = cur            cur.next = temp            gap -= 1        # 两部分合并        tail.next = second        return dummy.next        # write your code here


0 0