LeetCode----Reverse Linked List II

来源:互联网 发布:网络大电影招商案 编辑:程序博客网 时间:2024/06/04 20:15

Reverse Linked List II

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->NULLm = 2 and n = 4,

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

Note:
Given mn satisfy the following condition:
1 ≤ m ≤ n ≤ length of list.


代码:

# Definition for singly-linked list.class ListNode(object):    def __init__(self, x):        self.val = x        self.next = Noneclass Solution(object):    def reverseBetween(self, head, m, n):        """        :type head: ListNode        :type m: int        :type n: int        :rtype: ListNode        """        if m == n:            return head        mid = None  # 代表中间的串的头部        right = None  # 代表尾串的头部        p = head        index = 0        if m == 1:            while p:                index += 1                if index == n:                    right = p.next                    p.next = None                    break                p = p.next            mid = self.reverseList(head)            head = mid            p = self.getLastNode(mid)            p.next = right        else:            pre = None            ppre = None            while p:                index += 1                if index == m:                    ppre = pre                    ppre.next = None                    mid = p                if index == n:                    right = p.next                    p.next = None                    break                pre = p                p = p.next            mid = self.reverseList(mid)            mid_l = self.getLastNode(mid)            ppre.next = mid            mid_l.next = right                return head    def getLastNode(self, head):        p = head        while p.next:            p = p.next        return p    def reverseList(self, head):        pre, cur = None, head        while cur:            cur.next, pre, cur = pre, cur, cur.next        return pre


------------------------------------------------------------------------------------------------------------------------------------------

2016-05-01补充:

代码:

class Solution(object):    def reverseBetween(self, head, m, n):        """        :type head: ListNode        :type m: int        :type n: int        :rtype: ListNode        """        if m == n:            return head        dummy = ListNode(0)        dummy.next = head        leftpre = dummy        for i in range(m - 1):            leftpre = leftpre.next        pre = leftpre.next  # 此时的leftpre记录的为第m个节点        mid = pre.next        post = None        for i in range(n - m):  # 进行第m个节点到第n个节点的链表反转            post = mid.next            mid.next = pre            pre = mid            mid = post        leftpre.next.next = mid        leftpre.next = pre        return dummy.next


0 0
原创粉丝点击