链表-设计链表-js实现单链表

90 阅读2分钟

leetcode

js实现单链表 题意:

在链表类中实现这些功能:

  • get(index):获取链表中第 index 个节点的值。如果索引无效,则返回-1。
  • addAtHead(val):在链表的第一个元素之前添加一个值为 val 的节点。插入后,新节点将成为链表的第一个节点。
  • addAtTail(val):将值为 val 的节点追加到链表的最后一个元素。
  • addAtIndex(index,val):在链表中的第 index 个节点之前添加值为 val  的节点。如果 index 等于链表的长度,则该节点将附加到链表的末尾。如果 index 大于链表长度,则不会插入节点。如果index小于0,则在头部插入节点。
  • deleteAtIndex(index):如果索引 index 有效,则删除链表中的第 index 个节点。
// 节点定义
class LinkNode {
    constructor(val, next) {
        this.val = val;
        this.next = next;
    }
}

// 单链表
var MyLinkedList = function () {
    this._size = 0;
    this._head = null;
    this._tail = null;
};

/** 
 * @param {number} index
 * @return {number}
 */
MyLinkedList.prototype.getNode = function (index) {
    if (index >= this._size || index < 0) return null;

    // let node = this._head;
    let node = new LinkNode(0, this._head);
    while (index-- >= 0) {
        node = node.next;
    }
    return node;
};

/** 
 * @param {number} index
 * @return {number}
 */
MyLinkedList.prototype.get = function (index) {
    if (index >= this._size || index < 0) return -1;

    return this.getNode(index).val;

    // let node = this._head;
    // while (index-- > 0) {
    //     node = node.next;
    // }
    // return node.val;
};

/** 
 * @param {number} val
 * @return {void}
 */
MyLinkedList.prototype.addAtHead = function (val) {
    /*
        给头部添加节点
        1. 创建节点,val 是要创建的值, next 就是当前头部的节点
        2. 再把当前 _head 节点指向当前创建的 node
        3. _size 加 1
        4. 如果链表里面只有一个元素的话,还需要指定尾元素
    */
    let node = new LinkNode(val, this._head);
    this._head = node;
    this._size++;
    if (this._size === 1) {
        this._tail = node;
    }
};

/** 
 * @param {number} val
 * @return {void}
 */
MyLinkedList.prototype.addAtTail = function (val) {

    /*
        给尾部添加
        1. 创建节点,节点的 next 为 null
    */

    let node = new LinkNode(val, null);
    this._size++;

    if (this._tail) {
        this._tail.next = node;
        this._tail = node;
        return 
    }

    this._tail = node;
    this._head = node;
};

/** 
 * @param {number} index 
 * @param {number} val
 * @return {void}
 */
MyLinkedList.prototype.addAtIndex = function (index, val) {
    if (index > this._size || index < 0) return null;

    if (index === 0) {
        this.addAtHead(val);
    } else if (index === this._size) {
        this.addAtTail(val);
    } else {
        let findNode = this.getNode(index - 1);

        let node = new LinkNode(val, findNode.next);
        findNode.next = node;
        this._size++;
    }
};

/** 
 * @param {number} index
 * @return {void}
 */
MyLinkedList.prototype.deleteAtIndex = function (index) {
    if (index >= this._size || index < 0) return null;

    if (index === 0) {
        this._head = this._head.next;

        // 如果删除的节点是尾节点
        if (index == this._size - 1) {
            this._tail = this._head;
        }

    } else {
        let findNode = this.getNode(index - 1);

        findNode.next = findNode.next.next;

        // 处理末尾节点
        if (index == this._size - 1) {
            this._tail = findNode
        }
    }
    this._size--;
};

/**
 * Your MyLinkedList object will be instantiated and called as such:
 * var obj = new MyLinkedList()
 * var param_1 = obj.get(index)
 * obj.addAtHead(val)
 * obj.addAtTail(val)
 * obj.addAtIndex(index,val)
 * obj.deleteAtIndex(index)
 */

var obj = new MyLinkedList();

// obj.addAtHead('a');
// obj.addAtHead('b');
// obj.addAtHead('c');

obj.addAtTail(1);
// obj.addAtTail(2);

// obj.addAtIndex(-4, '你');
// obj.deleteAtIndex(2);

console.log('_head = ', obj._head)
console.log('_tail = ', obj._tail)
console.log('_size = ', obj._size)

// console.log(obj.get(0))
//  obj.getAll();