题目描述:
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}.
题目分析:
首先分析reorder之后链表的特点,就是头节点->尾节点->头节点->尾节点。
题目要求“in place”,所以要通过链表的一些操作来实现,不能用别的方法取巧。
解题思路也很简单,首先是将原链表分成两部分,大致是从中间分开;然后将后半部分链表反转;最后将两个链表合并。
代码如下:
/**
* 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;
if(head.next==null)
return;
if(head.next.next==null)
return;
/*split*/
ListNode p,q;
p = head;
q = head;
while(q!=null && q.next!=null){
p = p.next;
q = q.next.next;
}
ListNode t = p;
p = p.next;
t.next = null;
/*reverse*/
t = p;
p = p.next;
t.next = null;
while(p!=null){
q = p.next;
p.next = t;
t = p;
p = q;
}
/*merge*/
ListNode r;
p = head;
while(t!=null){
q = p.next;
r = t.next;
p.next = t;
t.next = q;
p = q;
t = r;
}
}
}