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.将原链表从中间一分为二,得到left,right两个子链表
2.对于left链表元素顺序不变,right链表反转
3.将right的表头和left的表头逐一取出,拼接在一起形成新表
例如:7,3,8,7,9,1,6,2,10
left
7--3--8--7---9
right
10--2--6--1
插入步骤:
7-10
7-10-3-2
7-10-3-2-8-6
7-10-3-2-8-6-7-1
7-10-3-2-8-6-7-1-9
java代码实现:
/**
* 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){
ListNode temp=middlePos(head);
ListNode right=temp.next;
right=inverseList(right);
ListNode left=head;
temp.next=null;
ListNode cur=head=new ListNode(-1);
while(right!=null){
ListNode leftnex=left.next;
ListNode rightnex=right.next;
left.next=null;
right.next=null;
cur.next=left;
cur.next.next=right;
cur=cur.next.next;
left=leftnex;
right=rightnex;
}
if(left!=null){
cur.next=left;
}
}
//cur.next=null;
}
public ListNode middlePos(ListNode head){
//find the right half list
ListNode low=head;
ListNode fast=head;
while(fast!=null && fast.next!=null){
low=low.next;
fast=fast.next.next;
}
return low;
}
public ListNode inverseList(ListNode head){
ListNode front=null;
ListNode cur=null;
while(head!=null){
cur=head;
head=head.next;
cur.next=null;
cur.next=front;
front=cur;
}
return front;
}
}
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}.