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);
posted @ 2021-12-07 14:43  入门级小菜  阅读(88)  评论(0编辑  收藏  举报