前端刷题日常Day2--链表题目

55 阅读4分钟

今日题目:

image.png

牛客网题目我已经打不开了,估计要买会员😓,不过当然已经保存github。而且leetcode上也有对应的题目。

题目一  154. 复杂链表的复制

这道题初级的做法使用一个map存储node节点和新创建节点的对应关系。遍历两遍列表:

  1. 遍历一遍构建节点和map
  2. 遍历第二遍设置新节点的next和random,都可以从map中直接取出来,如果有的话
var copyRandomList = function(head) {
    let newHead = new Node();
    let node = head;
    let map = new Map();
    while (node) {
        const newNode = new Node(node.val);
        map.set(node, newNode);
        node = node.next;
    }
    node = head;
    let pre = newHead;
    while (node) {
        let newNode = map.get(node);
        node.random && (newNode.random = map.get(node.random));
        node.next && (newNode.next = map.get(node.next));
        pre.next = newNode;
        pre = newNode;
        node = node.next;
    }
    return newHead.next;
};

题目二 83. 删除排序链表中的重复元素

这个第一次还做错了,又做了一遍好了。也不难,做了删除数组的重复元素,又开始做删除链表的重复元素,数组有的链表统统有,而且这都是基础操作吧。

var deleteDuplicates = function(head) {
    if (!head || !head.next) {
        return head;
    }
    let pre = head;
    let cur = head.next;
    while (cur) {
        if (pre.val === cur.val) {
            pre.next = cur.next;
            cur = cur.next;
        } else {
            pre = pre.next;
            cur = cur.next;
        }
       
    }
    return head;
};

题目三 136. 删除链表的节点

依然简单,但是删除链表的节点,要注意一个节点的情况,所以用一个哑节点来抹平差异。

var deleteNode = function(head, val) {
    let dummyHead = new ListNode();
    dummyHead.next = head;
    let pre = dummyHead;
    let cur = head;
    while (cur) {
        if (cur.val === val) {
            pre.next = cur.next;
        } else {
            pre = pre.next;
        }
        cur = cur.next;
    }
    return dummyHead.next;
};

碎碎念

这篇算法总结拖了很久,因为第一道题卡住了,以及过了周六日,陪娃,而这两天开发需求也没时间写。

但今天我emo了,为什么呢,因为想到不能开心的写代码了,我就难受。

所以如果有机会的话,我会继续看,因为无法认同这里的价值观,所以还是想follow my heart。

继续加油!!如果有机会,我一定要看,因为不能继续在这待下去了,待下去技术整个就废了。

我希望成为一个技术大牛。这就是我的愿望。即使前路坎坷,我依然想追寻内心。

虽然现实很残酷,尤其是对大龄程序员,当你前期没有很好的发展,在后期会非常被动,所以总是想劝刚入行几年的小鲜肉,如果你们依然想做程序员,依然觉得技术很niubi,那就好好珍惜前几年的工作时光,如果把握好了前几年,后期的职业生涯会越来越顺的,所谓先苦后甜就是这样的。但如果不想写代码的话就另说了。

为什么喜欢技术?

  1. 写代码会使心里安静下来,进入一段心流的状态。
  2. 当你解决一个难题的时候,会非常开心。
  3. 从大学到现在一直在计算机兜兜转转,想坚持下去,即使它对大龄不友好,那依然想做下去。

但当然只做技术的程序员是走不远的,因为技术是服务业务的,在做技术的时候一定要抬头看业务。如果你是一个普通的程序员,那工作时永远记得:

  1. 学习业务,了解你这个产品的背景,为什么有这个产品,为什么有这个需求。
  2. 经常反思,把遇到的问题及时记录下来。

但为什么之前没有做到?

因为需求太多了,一直在忙需求,忙碌着一休息下来就不想看代码了,而当时遇到的问题也没有及时总结,所以造成了恶性循环。持续的加班会不断地消耗你,所以当你持续加班的时候,一定要停下来想想自己有没有提升,及时进行反思和修正,防止自己的职业生涯到后期的被动。

这几年的感触,如果一直做重复低级别的工作,那就会在低级别打转,如果你升到了高级别,会在高级别不断升级。就像头部效应,资源机会会不断向头部人员集中,而如果你没有上升到头部,没有意识到这个问题,就会在低级别打转,一开始差距是不显现的,但这个差距会像指数级别一样随着时间的推移越来越显现出来。而且一直80分不如一次100分。所以做事情还是要追求极致,而自己的似乎缺乏这种极致感,我喜欢一遍一遍来,直到做到满意,而不是一次性做到极致。

念念叨叨了这么多,把自己的情绪处理下,继续学习了。

加油💪🏻!重新出发💪