/** * @param {number} index * @return {number} */ MyLinkedList.prototype.get = function (index) { if (index >= this.length || index < 0) { return -1; } let root = this.dummyHead; while (root && index >= 0) { root = root.next; if (index == 0) { return root.val; } index--; } return -1; };
/** * @param {number} val * @return {void} */ MyLinkedList.prototype.addAtHead = function (val) { const next = this.dummyHead.next; const newHead = newListNode(val, next); this.dummyHead.next = newHead; this.length++; };
/** * @param {number} val * @return {void} */ MyLinkedList.prototype.addAtTail = function (val) { const newEnd = newListNode(val); let root = this.dummyHead; while (root) { if (!root.next) { root.next = newEnd; break; } root = root.next; } this.length++; };
/** * @param {number} index * @param {number} val * @return {void} */ MyLinkedList.prototype.addAtIndex = function (index, val) { if (index > this.length) { return; } elseif (index == this.length) { this.addAtTail(val); } elseif (index == 0) { this.addAtHead(val); } else { let root = this.dummyHead; while (root && index > 0) { root = root.next; index--; if (index === 0) { const newNode = newListNode(val, root.next); root.next = newNode; } } this.length++; } };
/** * @param {number} index * @return {void} */ MyLinkedList.prototype.deleteAtIndex = function (index) { if (index >= this.length) return; let root = this.dummyHead; while (root && index >= 0) { if (index === 0) { const needDelete = root.next; const next = needDelete && needDelete.next ? needDelete.next : null; root.next = next; } root = root.next; index--; } this.length--; };
/** * 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) */
206. Reverse Linked List
Node:
create a new Node for every node
Or use two pointer to change on the input
Create new node for every one
Time Complexity && Space Complexity
Time Complexity: O(n)
Space Complexity: O(n): since need to create new ListNode in every loop
1 2 3 4 5 6 7 8 9
var reverseList = function (head) { let dummyHead = newListNode(); while (head) { const next = dummyHead.next; dummyHead.next = newListNode(head.val, next); head = head.next; } return dummyHead.next; };
Use two pointer to change on it, no need to create new ListNode every time
Time Complexity && Space Complexity
Time Complexity: O(n)
Space Complexity: O(1): only declare temp, prev, curr once
1 2 3 4 5 6 7 8 9 10 11 12 13
var reverseList = function (head) { if (!head || !head.next) return head; let temp = null; let prev = null; let curr = head; while (curr) { temp = curr.next; curr.next = prev; prev = curr; curr = temp; } return prev; };