剑指Offer刷题记录,第七题。

剑指 Offer 24. 反转链表(easy)


方法一:迭代法

思路:迭代法需要三个指针,分别是pre、cur以及nxt,用于顺序遍历链表。初始化时,pre指向空节点(头结点的next指向),cur指向头结点head,nxt指向head.next,同时由于head.next可能不存在,所以放在循环体中去初始化。迭代过程如下:
(1) nxt指向cur.next
(2) cur.next指向pre
(3) pre移动到cur位置
(4) cur移动到nxt位置
退出时,返回pre;

/* public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; } }*/
import java.util.*;
public class Solution {
   
    public ListNode ReverseList(ListNode head) {
   
        if (head == null || head.next == null) {
   
            return head;
        }
        ListNode pre = null, cur = head;
        while (cur != null) {
   
            ListNode nxt = cur.next;
            cur.next = pre;
            pre = cur;
            cur = nxt;
        }
        return pre; 
    }
}

时间复杂度: O(N), 因为需要正向遍历一遍链表。
空间复杂度: O(1), 未使用额外存储空间。

方法二:递归法

思路:该问题是满足递归 条件的,即大问题可以划分为子问题、子问题求解方式和大问题一样、存在最小子问题。具体到这道题即为:链表的反转可以化为头结点与头结点之后的节点反转两个子问题,而之后的节点反转又可以再次划分,到最后只剩下一个节点,或者该节点不存在即达到递归终止条件。而到每一层回归时,我们只需将当前head赋给head.next.next,而将null赋给head.next即可。

/* public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; } }*/
import java.util.*;
public class Solution {
   
    public ListNode ReverseList(ListNode head) {
   
    	// 递归终止条件
        if (head == null || head.next == null) {
   
            return head;
        }
        ListNode newHead = ReverseList(head.next);
        head.next.next = head;
        head.next = null;
        return newHead; 
    }
}

时间复杂度: O(N), 因为需要正向遍历一遍链表。
空间复杂度: O(N), 需要额外使用一个Stack来存放链表元素。
总结:本题考频极高,迭代写法类似于双指针,递归写法略微抽象。但这两种写法必须写得滚瓜烂熟!画图理解链表问题是最直观的方法 !

全部评论

相关推荐

机智的大学生这就开摆:有些地方描述有点儿空泛。传感器直接说清是哪款,要不然对方都不知道问啥。然后freertos那里的描述也是,加上freertos就实现了实时性吗?可以说基于freertos的调度,结合xxx优化/xxx技术实现了xxx检测的实时性。同时freertos也能实现异步io,也能实现灵活的并行架构和高并发。 检测时效性的问题要考虑哪里需要时效性,摔倒检测需要通过中断实现,至于温度这种大惯量就不需要,方案细节理清楚。然后freertos那里提升响应速度用的消息队列不是太合适,可以说是用的notify反正和消息队列差不多,或者说指针传参来优化消息队列的值传递进而提升线程间通信效率。 但凡是搞过开发的看一眼你的简历就知道有问题了,需要重新整理技术路线优化一下。首先搞清楚技术路线,描述好软硬框架,体现性能优化/低功耗等。例如后续针对xxx功能进行了xxx的优化,实现了xxx成果(这里可以展开描述你使用的工具链,你是用的串口调试助手还是RTT来打印日志,有没有用systemview来优化任务的优先级大小避免乱序调度,或者使用了Ozone调试定位问题等)。 描述问题上例如视觉项目那里,基于xxx通信接口编写xxx传感器的驱动,实现了xxx功能,并提供了xxx数据处理/稳定性/精确度/异步调用。或者也可以统一描述为基于xxx、xxx、xxx通讯协议编写xxx、xxx、xxx传感器的驱动。后续再单独给这些传感器的数据处理/优化等进行描述。 最重要的一点,实习栏太少了,五六个月不至于只干了这么点,把实习项目描述清楚,把自己会的不管有没有让你做都写进去。你写了实习这栏,内容就不能比剩下的两个项目差多少了。 最后就是看看岗位jd,跟着描述修改你的专业技能以及项目的描述,这样被回复的概率才大。 希望你早日找到理想工作!祝好
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务