Reorder List(チェーンテーブルの再配置)
1927 ワード
に質問
Given a singly linked list L: L0 → L1 → … → Ln-1 → Ln
reorder it to: L0 → Ln → L1 → Ln-1 → L2 → Ln-2 → …
Have you met this question in a real interview? Yes Example Given 1->2->3->4->null, reorder it to 1->4->2->3->null.
ぶんせき
チェーンテーブルにはコーナーマークがなく、操作時には前から後ろに、テーマの要求はLnが前にあるので、まず中間のノードを見つけて、後半を反転して、前半とマージすればいいと思います.
コード#コード#
Given a singly linked list L: L0 → L1 → … → Ln-1 → Ln
reorder it to: L0 → Ln → L1 → Ln-1 → L2 → Ln-2 → …
Have you met this question in a real interview? Yes Example Given 1->2->3->4->null, reorder it to 1->4->2->3->null.
ぶんせき
チェーンテーブルにはコーナーマークがなく、操作時には前から後ろに、テーマの要求はLnが前にあるので、まず中間のノードを見つけて、後半を反転して、前半とマージすればいいと思います.
コード#コード#
/**
* Definition for ListNode.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int val) {
* this.val = val;
* this.next = null;
* }
* }
*/
public class Solution {
/**
* @param head: The head of linked list.
* @return: void
*/
public void reorderList(ListNode head) {
// write your code here
if (head == null) {
return;
}
ListNode slow = head;
ListNode fast = head;
while (true) {
if (fast == null || fast.next == null) {
break;
}
slow = slow.next;
fast = fast.next.next;
}
ListNode node = slow.next;
slow.next = null;
slow = node;
while (slow != null) {
ListNode temp = slow.next;
if (temp == null) {
break;
}
slow.next = temp.next;
temp.next = node;
node = temp;
}
ListNode temp = new ListNode(0);
boolean b = true;
while (head != null && node != null) {
if (b) {
temp.next = head;
head = head.next;
} else {
temp.next = node;
node = node.next;
}
temp = temp.next;
b = !b;
}
if (head != null) {
temp.next = head;
temp = temp.next;
}
if (node != null) {
temp.next = node;
}
}
}