剑指Offer 06-24

100 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第3天,点击查看活动详情

一、剑指Offer 06-从尾到头打印链表

(一)题目内容

image.png

(二)解题方法

  • 初始化一个空数组存储返回结果,创建一个指针head,初始时指向链表的头节点
  • 从头遍历链表节点,当head指针指向的元素非空时,将从栈弹出的当前节点的值插入到数组头部,使用head变量记录当前节点的下一个节点,
  • 最后返回数组
  • 时间复杂度:O(n)O(n)。正向遍历一遍链表,然后从栈弹出全部节点,等于又反向遍历一遍链表。
  • 空间复杂度:O(n)O(n)。额外使用一个栈存储链表中的每个节点。
var reversePrint = function(head) {
    let result = []
    while(head!=null){
        result.unshift(head.val);
        head = head.next;
    }
    return result;
};

二、剑指Offer 24-反转链表

(一)题目内容

image.png

(二)解题方法

  • 使用迭代方法求解:首先创建temp指针指向链表头节点,遍历链表,将当前指针cur指向temp,使用temp遍历指向当前节点的下一个节点

  • 然后将当前节点的下一个节点指向反转后链表的表头

  • 时间复杂度:O(n)O(n),其中 nn是链表的长度,需要遍历链表一次。

  • 空间复杂度:O(1)O(1)

  • 还有一种用递归求解,可参考文章:反转链表

  • 题解代码如下:


var reverseList = function(head) {
    let pre = null;
    let cur = null;
    let temp = head;
    while(temp!=null){
        cur = temp;
        temp = temp.next;
        cur.next = pre;
        pre = cur;
        
    }
    return cur;

};