给定一个单链表
L
的头节点head
,单链表L
表示为:L0 → L1 → … → Ln - 1 → Ln请将其重新排列后变为:
L0 → Ln → L1 → Ln - 1 → L2 → Ln - 2 → …不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
示例 1:
输入:head = [1,2,3,4] 输出:[1,4,2,3]示例 2:
输入:head = [1,2,3,4,5] 输出:[1,5,2,4,3]提示:
- 链表的长度范围为
[1, 5 * 104]
1 <= node.val <= 1000
/** * @param {ListNode} head * @return {void} Do not return anything, modify head in-place instead. */ // 思路: // 1. 找到链表中点后分割其为 left 链表、right 链表两部分; // 2. 翻转 right 链表; // 3. 接着从 left 链表的左侧, 翻转后的 right 链表的左侧各取一个值进行交替拼接; var reorderList = function(head) { if (!head || !head.next) return head; // 找到中点 let slow = head, fast = head; while (fast && fast.next) { slow = slow.next; fast = fast.next.next; } // 反转后半部分链表 let prev = null, curr = slow; while (curr) { let next = curr.next; curr.next = prev; prev = curr; curr = next; } // 合并两个链表 let first = head, second = prev; while (second.next) { let temp1 = first.next; let temp2 = second.next; first.next = second; second.next = temp1; first = temp1; second = temp2; } return head; };
05-05
1512