LeetCode 92. Reverse Linked List II

11-9 LeetCode 92. Reverse Linked List II

Reverse Linked List II

Description

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, n满足下列条件:

**1 <= m <= n <= length

Solution 1:

这题目不难,就是在反转链表的基础上限定了一个范围。反转链表的题目之前一直没有做过,但是在网上看到过不少次,似乎是面试的经典题目,但其实很简单。

题目限定了一个范围m到n。那么思路就很简单了,将一个链表划分成三段。第一段称之为front,为m前面的所有节点;第二个为称之为mid,为m,n之间的结点(包括m和n);最后一段为back,为n之后的所有节点。将mid反转以后,再将三段连接在一起,则完成任务。

代码:

# 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
        """
        if n-m+1 == 1:
            return head
        front, temp = head, head
        if m == 1:
            front = None
            mid = head
        else:
            for i in range(m-2):
                temp = temp.next
            mid = temp.next
            front_end = temp
            temp.next = None # 截取front段
        back = mid # back为需要转置部分转置后的最后一个
        back_temp = ListNode(0)
        # 转置mid段中前n-m+1个
        for i in range(n-m+1):
            temp = mid.next
            mid.next = back_temp
            back_temp = mid
            mid = temp
        if front:
            front_end.next = back_temp
            back.next = temp
        else:
            back.next = temp
            return back_temp
        return front

感想

10天没有更新了,确实是没有时间。这10天看了两本书,然后还要完成学校的课,包括操作系统,计算机网络和不太想学的接口与汇编等等。。每一个都要花时间去学,因为os和计网都是挺重要的课,所以想去认真学习一下,就比较耗时。

你可能感兴趣的:(LeetCode 92. Reverse Linked List II)