const reverseList = head => { if (head == null || head.next == null) return head // 遍历到链表只有一个节点以后回退,也就是说下一步只剩一个节点就要回退了 let p = reverseList(head.next) // 当前节点变成队尾 head.next.next = head // 当前节点的next是null head.next = null return p }
const reverseList1 = head => { let cur = head, pre = null, next = null while (cur) { next = cur.next cur.next = pre pre = cur cur = next } return pre }
const copyRandomList = head => { const map = newMap() let p = head, pre = null // create new list and handle map for old list and new list while (p) { const node = new Node(p.val) map.set(p, node) pre && (pre.next = node) pre = node p = p.next } // log('new list', map.get(head)) // traverse map for (let [oldNode, newNode] of map.entries()) { let key = oldNode.random let findNode = map.get(key) newNode.random = findNode } return map.get(head) }
// 会超时 const lastRemaining1 = (n, m) => { let start = 0 let pre = null let head = null // create list ring while (start !== n) { const node = new ListNode(start) pre && (pre.next = node) !pre && (head = node) pre = node start += 1 } pre.next = head // 当只剩一个节点的时候,head === pre // count % m === 0 就说明要删除 let count = 0 while (head !== pre) { count += 1 if (count % m === 0) { pre.next = head.next } else { pre = pre.next } head = head.next } return head.val }
// 会超时 const hasCycle = function (head) { let result = false; if (!head) return result; let slow = head let quick = head.next while ((quick !== slow)) { if (!quick || !slow || !quick.next) { return result; } slow = slow.next quick = quick.next.next } if (quick === slow) { result = true } return result }
const detectCycle = function (head) { const set = newSet() let pos = null if (!head) return pos while (head) { if (set.has(head)) { pos = head break } else { set.add(head) } head = head.next } return pos }