算法打卡第三天 链表1 JS

67 阅读2分钟

203. 移除链表元素

/**
 * Definition for singly-linked list.
 * function ListNode(val, next) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.next = (next===undefined ? null : next)
 * }
 */
/**
 * @param {ListNode} head
 * @param {number} val
 * @return {ListNode}
 */
var removeElements = function(head, val) {
    // 设置虚拟头节点
    let dummyHead = new ListNode(0, head);
    // 保存头结点的下一个节点的指针
    let cur = dummyHead;
    while(cur.next) {
        // 需要删除哪一个节点,需要知道前面的节点,和后面节点
        if (cur.next.val === val) {
            // 如果是目标值,当前节点的下一个指针直接指向下下个节点,当前节点的下一节点因为没有被引用,就会被GC回收,打到一个移除节点元素的效果
            cur.next = cur.next.next;
            continue;
        }
        cur = cur.next;
    }
    // 返回创建的虚拟链表的头结点的下一个指针
    return dummyHead.next;

}

707. 设计链表

class LinkNode {
    constructor(val, next) {
        this.val = val;
        this.next = next;
    }
}


var MyLinkedList = function () {
    this.data = null;
    this.size = 0;
};
/** 
 * @param {number} index
 * @return {number}
 */
MyLinkedList.prototype.getNode = function (index) {
    if(index < 0 || index > this.size - 1) {
        return -1;
    }
    let cur = new LinkNode(0, this.data);
    while(index-- >= 0) {
        cur = cur.next;
    }
    return cur;
};
/** 
 * @param {number} index
 * @return {number}
 */
MyLinkedList.prototype.get = function (index) {
    let cur = this.getNode(index);
    // 如果直接判断val可能会存在0的情况,在JS中0是会转义成false
    return cur.val != undefined ? cur.val : -1;
};

/** 
 * @param {number} val
 * @return {void}
 */
MyLinkedList.prototype.addAtHead = function (val) {
    // 制造一个虚拟头结点,下一节点指向当前实例节点
    let dummyHead = new LinkNode(val, this.data);
    // 当前实例节点更新为创建出来的节点
    this.data = dummyHead; 
    this.size ++;
};

/** 
 * @param {number} val
 * @return {void}
 */
MyLinkedList.prototype.addAtTail = function (val) {
    let cur = this.data;
    let dummyHead = new LinkNode(val, null);
    if (!cur) {
        this.data = dummyHead;
    } else {
        while(cur.next) {
            cur = cur.next;
        }
        cur.next = dummyHead;
    }
    this.size++; 
};

/** 
 * @param {number} index 
 * @param {number} val
 * @return {void}
 */
MyLinkedList.prototype.addAtIndex = function (index, val) {
    if (index > this.size) {
        return -1;
    }
    if (index <= 0) {
        this.addAtHead(val);
        return;
    }
    if (index == this.size) {
        this.addAtTail(val);
        return;
    }
    // 实例出虚拟头结点
    let dummyHead = new LinkNode(val, this.data);
    let cur = this.getNode(index - 1);

    // 虚拟节点下一针指向当前节点的下一个几点
    dummyHead.next = cur.next;
    // 更新当前节点的下一个指针为虚拟子节点,完成插入节点的操作 
    cur.next = dummyHead;
    this.size++;

};



/** 
 * @param {number} index
 * @return {void}
 */
MyLinkedList.prototype.deleteAtIndex = function (index) {
    if (index < 0 || index > this.size - 1) {
        return -1;
    }
    if (index == 0) {
        let node = new LinkNode(0, this.data);
        let cur = node;
        cur.next = cur.next.next;
        this.data = node.next;
        this.size--;
        return;

    } else {
        // 获取需要删除的节点的前一个节点
        let cur = this.getNode(index - 1);
        // 获取的节点的下一指针指向下下个节点
        cur.next =  cur.next.next;
        this.size--;
        return;
    }

};

206. 反转链表 /**

  • @param {ListNode} head

  • @return {ListNode} */ var reverseList = function(head) { if (head && !head.next) { return head; }

    let cur = head,pre = null, temp = null; while (cur) { // 保存当前节点下个节点的指向 temp = cur.next; // 改变当前节点下一指针指向上一个节点,实现反转 cur.next = pre; // 更新上一节点 pre = cur; // 更新当前节点,继续循环 cur = temp; } return pre; };