zoukankan      html  css  js  c++  java
  • Leetcode 92. Reverse Linked List II

    Description: Reverse a linked list from position m to n. Do it in one-pass. Note: 1 ≤ mn ≤ length of list.

    Link: https://leetcode.com/problems/reverse-linked-list-ii/

    Examples:

    Example:
    
    Input: 1->2->3->4->5->NULL, m = 2, n = 4
    Output: 1->4->3->2->5->NULL

    思路: 206. Reverse Linked List 相比,需要找到第m-1, n+1节点,将m-n之间的reverse,head-m-1 重新连接 reversed list,再连n+1到结尾就可以了。当m=1时,m-1就是不合法的节点,所以要特殊考虑这种情况。

    # Definition for singly-linked list.
    # class ListNode(object):
    #     def __init__(self, val=0, next=None):
    #         self.val = val
    #         self.next = next
    class Solution(object):
        def reverseBetween(self, head, m, n):
            """
            :type head: ListNode
            :type m: int
            :type n: int
            :rtype: ListNode
            """
            if not head: return head
            if not head.next: return head
            if m == n: return head
            
            if m == 1:
                p = head
                q = p.next
                p.next = None
                length = 1
                while q:
                    f = q.next
                    q.next = p
                    p = q
                    q = f
                    length += 1
                    if length == n:
                        break
                head.next = q
                return p
            else:
                pre = head     
                p = head.next  
                length = 2     # p is the second node, so length start by 2
                while p:
                    if length == m:
                        rvs_head = p  # rvs_head is m Node before reverse, afterwards be n Node
                        end = pre     # end is the m-1 Node
                        break
                    pre = p
                    p = p.next
                    length += 1
                q = p.next
                length += 1  # now q is the moving node, and q=p.next make length plus 1
                p.next = None
                while q and length <= n:
                    f = q.next
                    q.next = p
                    p = q
                    q = f
                    length += 1
                end.next = p    # p is the head of reversed linked list
                rvs_head.next = q # q is the head of list begin by n+1 Node
                return head

    显然,这个代码太长了,有明显的冗余,症结在于m-1不合法,那不妨在head前加root节点,即使m=1,m-1可以指向root. 但是下面这个代码,时间和空间都占用更多。

    # Definition for singly-linked list.
    # class ListNode(object):
    #     def __init__(self, val=0, next=None):
    #         self.val = val
    #         self.next = next
    class Solution(object):
        def reverseBetween(self, head, m, n):
            """
            :type head: ListNode
            :type m: int
            :type n: int
            :rtype: ListNode
            """
            if not head: return head
            if not head.next: return head
            if m == n: return head
            
            root = ListNode(0)
            root.next = head
            
            pre = root
            p = root.next
            length = 1
            while p:
                if length == m:
                    rvs_head = p
                    end = pre
                    break
                pre = p
                p = p.next
                length += 1
            q = p.next
            length += 1
            p.next = None
            while q and length <= n:
                f = q.next
                q.next = p
                p = q
                q = f
                length += 1
            end.next = p
            rvs_head.next = q
            return root.next
    

    日期: 2020-11-20  今天很充实,很开心

  • 相关阅读:
    jquery 复制粘贴上传图片插件
    chrome插件的开发
    js获取剪切板内容,js控制图片粘贴
    记录前端常用的插件
    如何快速搭建node.js项目,app.js详解
    原型和原型链
    js 上传文件功能
    前端模块化开发发展史
    闭包实例
    5月8日疯狂猜成语-----对孔祥安组的测试版
  • 原文地址:https://www.cnblogs.com/wangyuxia/p/14012297.html
Copyright © 2011-2022 走看看