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}
.
思路: 1.找中点的一个点; 2. reverse后半部分; 3. 连接两个linkedlist
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public void reorderList(ListNode head) {
if(head == null || head.next == null) {
return;
}
ListNode middle = findMiddle(head);
ListNode l1 = head;
ListNode l2 = middle.next;
middle.next = null;
l2 = reverseLinkedList(l2);
while(l1 != null && l2 != null) {
ListNode l1next = l1.next;
ListNode l2next = l2.next;
l1.next = l2;
l2.next = l1next;
l1 = l1next;
l2 = l2next;
}
}
public ListNode findMiddle(ListNode node) {
if(node == null || node.next == null) {
return node;
}
ListNode slow = node;
ListNode fast = node;
while(fast != null && fast.next != null) {
slow = slow.next;
fast = fast.next.next;
}
return slow;
}
public ListNode reverseLinkedList(ListNode head) {
if(head == null || head.next == null) {
return head;
}
ListNode dummpy = new ListNode(-1);
dummpy.next = head;
ListNode cur = dummpy.next;
while(cur != null && cur.next != null) {
ListNode curnext = cur.next;
cur.next = curnext.next;
curnext.next = dummpy.next;
dummpy.next = curnext;
}
return dummpy.next;
}
}