Given a singly linked list L: L0→L1→…→Ln-1→Ln,
reorder it to: L0→Ln→L1→Ln-1→L2→Ln-2→…
You must do this in-place without altering the nodes' values.
For example,
Given {1,2,3,4}
, reorder it to {1,4,2,3}
.
思路:将链表从中间分为两部分,然后减后半部分反转,然后再将后半部分,依次往前半部分插
代码如下(已通过leetcode)
public class Solution {
public void reorderList(ListNode head) {
if (head == null || head.next == null)
return;
ListNode middle = getmiddle(head);
ListNode next = middle.next;
middle.next = null;
next = reverseListNode(next);
ListNode ans = new ListNode(-1);
ListNode res = ans;
while (next != null) {
res.next = head;
head = head.next;
res = res.next;
res.next = next;
next = next.next;
res = res.next;
}
if (head != null) {
res.next = head;
res = res.next;
}
head = ans.next;
}
public ListNode getmiddle(ListNode head) {
ListNode slow = head;
ListNode fast = head;
while (fast.next != null && fast.next.next != null) {
slow = slow.next;
fast = fast.next.next;
}
return slow;
}
public ListNode reverseListNode(ListNode head) {
if (head == null && head.next == null)
return head;
ListNode pre = head;
ListNode later = head.next;
pre.next = null;
while (later != null) {
ListNode temp = later.next;
later.next = pre;
pre = later;
later = temp;
}
return pre;
}
}