给定一个单链表 L 的头节点 head ,单链表 L 表示为:
L0 → L1 → … → Ln-1 → Ln
请将其重新排列后变为:
L0 → Ln → L1 → Ln-1 → L2 → Ln-2 → …
不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
- 思路: 把后半部分倒置 把第二个链表分别插入前半部分
- 找到中间节点(分别考虑,偶数是前边那个节点 奇数就是中间那个节点)
- 翻转 l2, 断链
- 插入 (暂存second节点 ,改变指针,更新节点)
class Solution {
public void reorderList(ListNode head) {
ListNode middlenode = findmiddlenode(head);
ListNode l2=reversenode(middlenode.next);
middlenode.next=null;
ListNode l1 =head;
while(l1!=null && l2!=null){
ListNode tmp1=l1.next;
ListNode tmp2=l2.next;
l1.next=l2;
l2.next=tmp1;
l1=tmp1;
l2=tmp2;
}
}
ListNode findmiddlenode(ListNode head){
if(head==null||head.next==null){
return head;
}
ListNode fast=head;
ListNode slow=head;
while(fast.next!=null&&fast.next.next!=null ){
fast=fast.next.next;
slow=slow.next;
}
return slow;
}
ListNode reversenode(ListNode head){
if(head==null||head.next==null){
return head;
}
ListNode pre=null;
ListNode cur=head;
while(cur!=null){
ListNode tmp=cur.next;
cur.next=pre;
pre=cur;
cur=tmp;
}
return pre;
}
}