leetcode-206 | 反转链表

题目描述

反转一个单链表。

示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
进阶:
你可以迭代或递归地反转链表。你能否用两种方法解决这道题?

解答思路

思想来源于数据结构中的链表的翻转。

翻译如下:

# 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
        #加入一个虚拟头节点,方便操作
        virtual = ListNode(0)
        virtual.next = None
        p = head
        q = head.next
        while q:
            p.next = virtual.next
            virtual.next = p
            p = q
            q = q.next
           #最后一个位置,也就是q,赋值后的p,还没有完成赋值,需要退出循环后再重复一次
        p.next = virtual.next
        virtual.next = p
        return virtual.next

结果:

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

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

很老土的解法

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

# 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-206 | 反转链表》 by 梦否 is licensed under a Creative Commons Attribution 4.0 International License
 Previous
leetcode-92 | 反转链表II leetcode-92 | 反转链表II
题目描述反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。 说明:1 ≤ m ≤ n ≤ 链表长度。示例:输入: 1->2->3->4->5->NULL, m = 2, n = 4输出: 1->4
2019-05-03
Next 
leetcode-220 | 存在重复元素 III leetcode-220 | 存在重复元素 III
题目描述给定一个整数数组,判断数组中是否有两个不同的索引 i 和 j,使得 nums [i] 和 nums [j] 的差的绝对值最大为 t,并且 i 和 j 之间的差的绝对值最大为 ķ。 示例:输入: nums = [1,2,3,1],
2019-05-03
  TOC