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}
.
My Answer
/**
* 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 || head.next == null){
return;
}
int total = 0;
ListNode pivot = head;
//count the number of nodes in the list
while(pivot != null){
pivot = pivot.next;
total++;
}
int splitIndex = total / 2 + total % 2;
pivot = head;
int shiftTime = 0;
//get the middle node in the list
while(shiftTime < splitIndex){
pivot = pivot.next;
shiftTime++;
}
ListNode secondHead = pivot;
pivot = pivot.next;
secondHead.next = null;
//reverse the second half of the list
while(pivot != null){
ListNode temp = pivot;
pivot = pivot.next;
temp.next = secondHead;
secondHead = temp;
}
ListNode firstPivot = head;
ListNode secondPivot = secondHead;
//get the node from the first half and second half of the list one by one
while(secondPivot != null){
ListNode temp = secondPivot;
secondPivot = secondPivot.next;
temp.next = firstPivot.next;
firstPivot.next = temp;
firstPivot = temp.next;
}
if(firstPivot != null){
firstPivot.next = null;
}
}
}
题目来源:https://oj.leetcode.com/problems/reorder-list/