题目描述
Given a singly linked list L: L 0→L 1→…→L n-1→L n,
reorder it to: L 0→L n →L 1→L n-1→L 2→L n-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}.
解题思路:
- 链表拆分成左右两段
- 右半边逆序
- 依次拼接 左边走一个 右边走一个
/**
* Definition for singly-linked list.
* class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
public void reorderList(ListNode head) {
if (head == null)
return;
ListNode[] ls = cut(head);
ListNode left = ls[0];
ListNode right = reverseList(ls[1]);
ListNode preRightNext = null, preLeftNext = null, tmpLeft = left, tmpRight = right;
while (tmpLeft != null || tmpRight != null) {
if (tmpRight == null) {
break;
} else {
preRightNext = tmpRight.next;
preLeftNext = tmpLeft.next;
tmpLeft.next = tmpRight;
tmpRight.next = preLeftNext;
tmpRight = preRightNext;
tmpLeft = preLeftNext;
}
}
}
public ListNode[] cut(ListNode head) {
ListNode fast = head, slow = head;
while (fast.next != null && fast.next.next != null) {
fast = fast.next.next;
slow = slow.next;
}
ListNode right = slow.next;
slow.next = null;
return new ListNode[] {head, right};
}
public ListNode reverseList(ListNode head) {
ListNode next = null;
ListNode pNext = null;
while (head != null) {
pNext = head.next;
head.next = next;
next = head;
head = pNext;
}
return next;
}
}