leetcode-92 | 反转链表II

题目描述

反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。

说明:
1 ≤ m ≤ n ≤ 链表长度。
示例:
输入: 1->2->3->4->5->NULL, m = 2, n = 4
输出: 1->4->3->2->5->NULL

解答思路

类似的使用取数据,组成数据正确集,生成格式

翻译如下:

# 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
        """
        li = []
        p = head
        m, n = m-1, n-1
        while p:
            li.append(p.val)
            p = p.next

        i,j = m, n
        while i <= j:
            li[i], li[j] = li[j], li[i]
            i+=1
            j-=1

        head = ListNode(li[0])
        p = head
        for i in range(1,len(li)):
            s = ListNode(li[i])
            p.next = s
            p = p.next
        p.next = None

        return head

结果:

执行用时 : 40 ms, 在Reverse Linked List II的Python提交中击败了27.61% 的用户
内存消耗 : 11.8 MB, 在Reverse Linked List II的Python提交中击败了36.22% 的用户

提交时间状态执行用时内存消耗语言
几秒前通过40 ms11.8MBpython

很老土的解法

遍历获取数据,翻转,构成数据格式

# Definition for singly-linked list.
# class ListNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.next = None
class Solution(object):
    def reverseList(self, head):
        """
        :type head: ListNode
        :rtype: ListNode
        """
        if head==None or head.next==None:
            return head
        #可以把数据全部整下来,在反转,在构成
        li = []
        p = head
        while p:
            li.append(p.val)
            p=p.next
        li.reverse()
        head = ListNode(li[0])
        p = head
        for i in range(1,len(li)):
            s = ListNode(li[i])
            p.next = s
            p=p.next

        p.next = None

        return head

结果:

执行用时 : 44 ms, 在Reverse Linked List的Python提交中击败了36.40% 的用户
内存消耗 : 15.7 MB, 在Reverse Linked List的Python提交中击败了16.62% 的用户

提交时间状态执行用时内存消耗语言
几秒前通过44 ms15.7MBpython

我们使用指针(推荐)

图解:
e

# Definition for singly-linked list.
# class ListNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.next = None
class Solution(object):
    def reverseList(self, head):
        """
        :type head: ListNode
        :rtype: ListNode
        """
        if head==None or head.next==None:
            return head
        pre = None
        cur = head

        while cur:
            #由于如果cur为None的时候,是没有next的,所以我们将它放置到了循环中,判断非None生效,故而在这里声明我们的饿next指针
            next = cur.next

            #我们的移动逻辑
            cur.next = pre
            pre = cur
            cur = next

        return pre  #cur一定是None

结果:

执行用时 : 36 ms, 在Reverse Linked List的Python提交中击败了100.00% 的用户
内存消耗 : 13.3 MB, 在Reverse Linked List的Python提交中击败了50.21% 的用户

提交时间状态执行用时内存消耗语言
几秒前通过36 ms13.3MBpython
分析: 如果用两个指针,如下图,是不好操作的。 ![e](/images/201905/2019-05-03_200551.jpg "两个指针情况")

   Reprint policy


《leetcode-92 | 反转链表II》 by 梦否 is licensed under a Creative Commons Attribution 4.0 International License
 Previous
leetcode-83 | 删除排序链表中的重复元素 leetcode-83 | 删除排序链表中的重复元素
题目描述给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。 示例 1:输入: 1->1->2输出: 1->2 示例 2:输入: 1->1->2->3->3输出: 1->2-&
2019-05-04
Next 
leetcode-206 | 反转链表 leetcode-206 | 反转链表
题目描述反转一个单链表。 示例:输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1->NULL进阶:你可以迭代或递归地反转链表。你能否用两种方法解决
2019-05-03
  TOC