问题的难点在于链表是单向的...因而我们可以把后一半的链表倒序再插入前一半中...
利用快慢指针找到链表的中点并利用两个指针将后一半链表颠倒...
插入的时候按次将点到后的后一半节点插入到前一般中即可.....
需要注意的是在颠倒和插入节点的时候,最好使用新的对象来避免之后变量改变导致之前也受影响....还是需要细心,多考虑可能出现的边界情况
/**
* 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 slow = head;
ListNode fast = head;
int len=1;
while(fast.next!=null&&fast.next.next!=null)
{
slow = slow.next;
fast = fast.next.next;
len++;
}
if(len==1)
{
return ;
}
ListNode half_start = slow.next;
ListNode bef = null;
while(half_start!=null)
{
ListNode now = new ListNode(half_start.val);
half_start = half_start.next;
now.next = bef;
bef = now;
}
ListNode res = head;
while(len>0)
{
len = len-1;
ListNode tmp = res.next;
if(bef==null)
{
res.next = null;
break;
}
else
{
res.next = new ListNode(bef.val);
res = res.next;
bef = bef.next;
}
if(len!=0)
{
res.next = tmp;
res = res.next;
}
}
return ;
}
}