[算法 专题 ] 反转链表的摸鱼之日

本文探讨了链表反转的两种常见方法:递归和双指针迭代。递归版本通过层层调用实现反转,时间复杂度O(N),空间复杂度O(N);迭代方法利用pre和cur指针,空间复杂度O(1),同样时间复杂度O(N)。两种方法各有优劣,适用于不同场景。
摘要由CSDN通过智能技术生成

目录

前言: 

代码:

解题思路:

复杂度分析:

算法思想二:双指针迭代

解题思路:

复杂度分析:


前言: 

        生活是蜿蜒在山中的小径,坎坷不平,沟崖在侧。摔倒了,要哭就哭吧,怕什么,不心装模作样!这是直率,不是软弱,正因哭一场并不影响赶路,反而能增添一份留意。山花烂漫,景色宜人,如果陶醉了,想笑就笑吧,不心故作矜持!这是直率,不是骄傲,正因笑一次并不影响赶路,反而能增添一份信心。

代码:

public class method{

    public ListNode ReverseList(ListNode head) {

        if (head == null || head.next == null) {

            return head;

        }

        ListNode res = ReverseList(head.next);

        head.next.next = head;

        head.next = null;

        return res;

    }

}

解题思路:

递归上来就先写终止条件:如果head为空或者head.next为空,返回head
(1)新头结点 res 指向尾结点,此处进入递归,递归一直到遍历到尾结点时才会返回
(2)每一层递归,该层递归中的 head 会让下一个节点指向自己,head.next.next = head;然后head自己指向空。以此达到反转的目的。
(3)返回新链表的头结点newHead

复杂度分析:

时间复杂度O(N):N表示链表长度

空间复杂度O(N):递归机制的实现需要借助于栈,该程序中递归栈的深度为N-1,所以空间复杂度为线性。


算法思想二:双指针迭代

class Solution:
    # 返回ListNode
    def ReverseList(self, pHead):
        # write code here
        # 空链表或只有一个节点得链表
        if not pHead&nbs***bsp;not pHead.next:
            return pHead
        cur = pHead
        pre = None
        # 循环移动curent和pre,移动过程中反转 curent.next=pre
        while cur:
            next_node = cur.next
            cur.next = pre
            pre = cur
            cur = next_node
        return pre

解题思路:

(1)定义两个指针: pre 和 cur ;pre 在前 cur 在后。
(2)每次让 pre 的 next 指向 cur ,实现一次局部反转
(3)局部反转完成之后, pre 和 cur 同时往前移动一个位置
(4)循环上述过程,直至 pre 到达链表尾部

复杂度分析:

时间复杂度O(N):N表示链表长度,双指针一次遍历

空间复杂度O(1):常数大小空间指针

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

是汤圆丫

怎么 给1分?

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

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

打赏作者

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

抵扣说明:

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

余额充值