Reorder List

题目描述:
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,3,4,5,6,7,要得到的结果是1,7,2,6,3,5,4.
1、先把数组分成两个部分:1,2,3,4和5,6,7
2、将5,6,7逆序得到7,6,5
3、然后将7,6,5插入到1,2,3,4中
逆序,插入,查找链表中第k个数,这些都是很熟悉的操作,代码如下:

public void reorderList(ListNode head) {
    int sum=0;
    ListNode p=head;
    //得到链表的长度
    while(p!=null){
        p=p.next;
        sum++;
    }
    if(sum<=2)
        return;
    int n=(sum+1)/2;
    /*将链表分成两个链表。第一个链表head开头,n个,第二个链表head2开头,sum-n个,注意这里的第一个链表最后一个节点的next要赋值为null*/
    p=head;
    while(n>1){
        p=p.next;
        n--;
    }
    ListNode head2=p.next;
    p.next=null;
    //tail找到整个链表的最后一个节点
    ListNode tail=head2;
    while(tail.next!=null){
        tail=tail.next;
    }
    //将第二个数组逆序
    p=tail;
    while(head2!=tail){
        ListNode next=head2.next;
        head2.next=tail.next;
        tail.next=head2;
        head2=next;
    }
    head2=tail;
    p=head;
    //将第二个数组插入到第一个数组中
    while(head2!=null){
        ListNode next=head2.next;
        ListNode pnext=p.next;
        head2.next=p.next;
        p.next=head2;
        head2=next;
        p=pnext;
    }
}

你可能感兴趣的:(java,LeetCode,链表)