每日一题-链表反转

学习目标:

给你单链表的头节点 head ,请你反转链表,并返回反转后的链表


学习内容:

在这里插入图片描述

解法一:
思路:使用栈的特性,栈是先进后出的。实现原理就是把链表节点一个个入栈,当全部入栈完之后再一个个出栈,出栈的时候在把出栈的结点串成一个新的链表
在这里插入图片描述

class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next
class Solution:
    def reverseList(self, head: ListNode) -> ListNode:
        stack = list()
        if  head == None:
            return None
        while head is not None:
            stack.append(head)
            head = head.next
        if  len(stack) == 0:
            return None
        node = stack.pop()
        result_head = node
        while len(stack) > 0:
            tmp_node = stack.pop()
            node.next =tmp_node
            node = node.next
        node.next = None
        return result_head

在这里插入图片描述

解法二:使用双链表求解
双链表求解是把原链表的结点一个个摘掉,每次摘掉的链表都让他成为新的链表的头结点,然后更新新链表。下面以链表1→2→3→4为例画个图来看下
在这里插入图片描述

  def reverseList(self, head: ListNode) -> ListNode:
        new_head= None
        while head is not None:
             tmp = head.next
             head.next = new_head
             new_head = head
             head = tmp
        return new_head

在这里插入图片描述

解法三:使用递归法

class Solution:
    def reverseList(self, head: ListNode) -> ListNode:
        #终止条件
        if head is None or head.next is None:
           return head
        #保存当前节点的下一个结点
        next_node = head.next
        #从当前节点的下一个结点开始递归调用
        obj = Solution()
        reverse = obj.reverseList(next_node)
        #reverse是反转之后的链表,因为函数reverseList 表示的是对链表的反转,所以反转完之后next肯定
        # 是链表reverse的尾结点,然后我们再把当前节点,head挂到next节点的后面就完成了链表的反转。
        next_node.next = head
        #这里head相当于变成了尾结点,尾结点都是为空的,否则会构成环
        head.next = None
        return reverse

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值