zoukankan      html  css  js  c++  java
  • leetcode热门100知识点总结

    1. 双向链表相关
    class Node {
        constructor(data) {
            this.data = data;  // 节点的数据域
            // this.prev = null;  // 节点的指针域
            this.next = null;  // 节点的指针域
        }
    }
    class SingleList {
        constructor() {
            this.size = 0;  // 单链表的长度
            this.head = new Node('head');  // 表头节点
            this.currNode = '';  // 当前节点的指向
        }
        // 判断单链表是否为空
        isEmpty() {
            return this.size === 0;
        }
        // 获取单链表的最后一个节点
        findLast() {
            let currNode = this.head;
            while (currNode.next) {
                currNode = currNode.next;
            }
            return currNode;
        }
        // 单链表的遍历显示
        display() {
            let result = '';
            let currNode = this.head;
            while (currNode) {
                result += currNode.data;
                currNode = currNode.next;
                if(currNode) {
                    result += '->';
                }
            }
            console.log(result);
        }
        // 从当前位置向前移动 n 个节点。
        advance(n, currNode = this.head) {
            this.currNode = currNode;
            while ((n--) && this.currNode.next) {
                this.currNode = this.currNode.next;
            }
            return this.currNode;
        }
        // 在单链表中寻找item元素
        find(item) {
            let currNode = this.head;
            while (currNode && (currNode.data !== item)) {
                currNode = currNode.next;
            }
            return currNode;
        }

        // 显示当前节点
        show() {
            console.log(this.currNode.data);
        }

        // 获取单链表的长度
        getLength() {
            return this.size;
        }

        // 向单链表中插入元素
        insert(item, element) {
            let itemNode = this.find(item);
            if(!itemNode) {  // 如果item元素不存在
                return;
            }
            let newNode = new Node(element);

            newNode.next = itemNode.next; // 若currNode为最后一个节点,则currNode.next为空
            itemNode.next = newNode;
           
            this.size++;
        }

        // 在单链表中删除一个节点
        remove(item) {
            if(!this.find(item)) {  // item元素在单链表中不存在时
                return;
            }
            // 企图删除头结点
            if (item === 'head') {
                if (!(this.isEmpty())) {
                    return;
                } else {
                    this.head.next = null;
                    return;
                }
            }

            let currNode = this.head;

            while (currNode.next.data !== item) {
                // 企图删除不存在的节点
                if (!currNode.next) {
                    return;
                }
                currNode = currNode.next;
            }


            currNode.next = currNode.next.next;
            this.size--;
        }

        // 在单链表的尾部添加元素
        append(element) {
            let currNode = this.findLast();
            let newNode = new Node(element);
            currNode.next = newNode;
            this.size++;
        }

        // 清空单链表
        clear() {
            this.head.next = null;
            this.size = 0;
        }
    }

    var l1 = new SingleList();
    l1.append(2);
    l1.append(4);
    l1.append(3);

    var l2 = new SingleList();
    l2.append(5);
    l2.append(6);
    l2.append(4);

    var addTwoNumbers = function(l1, l2) {
        console.log('l===',l1,l2);
        const l3 = new Node(0) // 定义一个链表来存放结果
        let p1 = l1.head.next // 指向链表1的头部
        let p2 = l2.head.next // 指向链表2的头部
        let p3 = l3
        let carry = 0 // 进位的数,即留到下一轮相加的数
        while(p1 || p2) {
            // 这两个三元判断是为了防止相加的两个数长度不同
            const v1 = p1 ? p1.data : 0
            const v2 = p2 ? p2.data : 0
            const val = v1 + v2 + carry
            carry = Math.floor(val / 10) // 相加后的十位数
            p3.next = new Node(val % 10) // 相加后的个位数
            // 指针继续往后走
            if(p1) p1 = p1.next
            if(p2) p2 = p2.next
            p3 = p3.next
        }
        // 处理特殊情况:如[2,2,7] + [5,6,4]这种加到最后一个还有进位的情况
        if(carry) {
            p3.next = new SingleList(carry)
        }
        console.log('l3==',l3.next);
        return l3.next
    };
    addTwoNumbers(l1,l2);
  • 相关阅读:
    css3圆角细节
    css3伪元素
    使用vscode在谷歌上运行代码
    SpringCloud-技术专区-Gateway优雅的处理Filter抛出的异常
    SpringCloud-技术专区-Gateway全局通用异常处理
    Mybatis-技术专区-插件开发指南
    消息中间件-技术专区-RabbitMQ基本介绍
    SpringBoot-技术专区-自定义TaskExecutor线程池
    MySQL-技术专区-Binlog和Redolog的介绍
    SpringBoot-技术专区-Redis同数据源动态切换db
  • 原文地址:https://www.cnblogs.com/cjr001/p/15656110.html
Copyright © 2011-2022 走看看