leetcode刷题之206.反转链表

leetcode刷题之206.反转链表

  • 题目
    反转一个单链表.
  • 示例 :
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
  • 进阶
    你可以迭代或递归地反转链表。你能否用两种方法解决这道题?
  • 代码1:
# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None
class Solution:
    def reverseList(self, head: ListNode) -> ListNode:
        prev = None
        current = head
        while current:
            next_node = current.next
            current.next = prev
            prev = current
            current = next_node
        head = prev
        return head
# 执行用时 :52 ms, 在所有 Python3 提交中击败了83.84%的用户
# 内存消耗 :14.8 MB, 在所有 Python3 提交中击败了19.68%的用户
  • 算法说明:
    设定两个指针,prev表示空指针,current表示当前的头节点,建立循环当current指向最后一个节点时,值为Null,循环结束,循环里面用next_node存储当前节点的下一个节点,然后交换当前节点和下一个节点,将当前节点的指针移动给下一位,继续循环。
    第一次循环:
    (1)第一步:next_node = current.next
    将current.next赋值给next_node变量,next指向了节点2,先将节点2保存起来;
    Alt
    (2)第二步:current.next = prev
    将prev = None赋值给current.next,也就是说将节点1指向了Null;
    在这里插入图片描述
    (3)第三步:prev = current
    将current赋值给了prev,即prev指向节点1;
    在这里插入图片描述
    (4)第四步:current = next_node
    将next_node赋值给current,即current指向了节点2.将节点2设为“头节点”。
    在这里插入图片描述
    第二次循环:
    (1)第一步:next_node = current.next
    将current.next赋值给next_node变量,next指向了节点3,先将节点3保存起来;
    在这里插入图片描述
    (2)第二步:current.next = prev
    将prev = None赋值给current.next,第一次循环中prev指向了节点1,第二次循环中节点2指向了节点1,从而完成了翻转;
    在这里插入图片描述
    (3)第三步:prev = current
    将current赋值给了prev,即prev指向节点2;
    在这里插入图片描述
    (4)第四步:current = next_node
    将next_node赋值给current,即current指向了节点3.将节点3设为“头节点”。
    在这里插入图片描述
    持续循环,完成所有节点的翻转:
    在这里插入图片描述
    完整过程如下:
    在这里插入图片描述
  • 代码2:
# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None
class Solution:
    def reverseList(self, head: ListNode) -> ListNode:
        if head == None:
            return head
        a =[]
        result = ListNode(None)
        while head != None:
            a.append(head.val)
            head = head.next
        a = a[::-1]
        for i in range(len(a)):
            node = ListNode(a[i])
            if i == 0:
                temp = node
            result.next = node
            result = result.next
        return temp
# 执行用时 :92 ms, 在所有 Python3 提交中击败了7.91%的用户
# 内存消耗 :15.9 MB, 在所有 Python3 提交中击败了14.51%的用户
  • 算法说明:
    建立一个列表a,和一个链表result;将head链表中的元素遍历并存储到列表a中,先将列表a翻转,然后将a中的元素逐个添加到链表result中,注意在第一次添加的时候,保存头节点temp = node,然后返回头节点temp。

  • 代码3:

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None
class Solution:
    def reverseList(self, head: ListNode) -> ListNode:
        if head == None:
            return head
        result = ListNode(head.val)
        head = head.next
        while head != None:
            result = self.insert(0,head.val,result)
            head = head.next
        return result
    def insert(self,key,value,result): #lian biao cha ru yuan su
        node = ListNode(value)
        node.next = result
        return node
# 执行用时 :60 ms, 在所有 Python3 提交中击败了47.19%的用户
# 内存消耗 :15.7 MB, 在所有 Python3 提交中击败了14.51%的用户
  • 算法说明:
    先判断链表是否为空,如果为空,直接返回;建立一个空链表result,让链表result头部指向head的头部,然后将head的指针向后移动一位,即head = head.next;建立当head的头部不为空时的循环,使用insert函数,将head链表的元素逐个插入到新建的链表result的头部,返回result即可。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

O_胡萝卜_O

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值