LeeCode-刷题日记-Day25

24. 两两交换链表中的节点

思路:迭代,通过创建一个空节点在head之前,再遍历next和next.next进行次序交换,当没有next并且没有next.next时终止循环。

/**
 * Definition for singly-linked list.
 * function ListNode(val, next) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.next = (next===undefined ? null : next)
 * }
 */
/**
 * @param {ListNode} head
 * @return {ListNode}
 */
var swapPairs = function(head) {
    let k=new ListNode(0,head);
    let p=k;
    while(p.next!==null&&p.next.next!==null){
        let temp=p.next;
        p.next=p.next.next;
        temp.next=temp.next.next;
        p.next.next=temp;
        p=temp;
    }
    return k.next;
};

707. 设计链表

function ListNode(val, next) {
    this.val = (val===undefined ? 0 : val)
    this.next = (next===undefined ? null : next)
}

var MyLinkedList = function(val,next) {
    this.head=null;
    this.size=0;
};

/** 
 * @param {number} index
 * @return {number}
 */
MyLinkedList.prototype.get = function(index) {
    if(this.size===0) return -1;
    if(index<0||index>=this.size) return -1;
    let cur=this.head;
    while(index>0){
        cur=cur.next;
        index--;
    }
    return cur.val;
};

/** 
 * @param {number} val
 * @return {void}
 */
MyLinkedList.prototype.addAtHead = function(val) {
    let s=new ListNode(val);
    s.next=this.head;
    this.head=s;
    this.size++;
};

/** 
 * @param {number} val
 * @return {void}
 */
MyLinkedList.prototype.addAtTail = function(val) {
    let s=new ListNode(val);
    if(this.size===0){
        this.head=s;
        this.size++;
    }else{
        let tail = this._getItem(this.size-1);
        if(!tail) return;
        tail.next=s;
        this.size++;
    }
};

/** 
 * @param {number} index 
 * @param {number} val
 * @return {void}
 */
MyLinkedList.prototype.addAtIndex = function(index, val) {
    if(index>this.size) return;
    let s=new ListNode(val);
    if(index<=0){return this.addAtHead(val)};
    if(index===this.size){return this.addAtTail(val)};
    let prev=this._getItem(index-1);
    s.next=prev.next;
    prev.next=s;
    this.size++;
};

/** 
 * @param {number} index
 * @return {void}
 */
MyLinkedList.prototype.deleteAtIndex = function(index) {
    if(this.size===0) return;
    if(index<0||index>=this.size) return;
    if(index===0){this.head=this.head.next};
    if(index>0&&index<this.size){
        let prev=this._getItem(index-1);
        let next=this._getItem(index+1);
        prev.next=next;
    }
    this.size--;
};
MyLinkedList.prototype._getItem = function (index) {
    if (this.size === 0) return null;
    if (index < 0 || index >= this.size) return null;
    let cur = this.head;
    while (index > 0) {
        cur = cur.next;
        index--;
    }
    return cur;
};

/**
 * 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)
 */