给定一个单链表 L 的头节点 head ,单链表 L 表示为:
L0 → L1 → … → Ln-1 → Ln 请将其重新排列后变为:
L0 → Ln → L1 → Ln-1 → L2 → Ln-2 → …
不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
示例 1:

输入: head = [1,2,3,4] 输出: [1,4,2,3]
示例 2:

输入: head = [1,2,3,4,5] 输出: [1,5,2,4,3]
提示: 链表的长度范围为 [1, 5 * 10^4] 1 <= node.val <= 1000
题目的意图是想要重组链表, 按照[头]->[尾]->[头]->[尾]...的方式重新排列 因为为单向链表, 不能从尾部逆序推出前一个节点 所以比较容易想到的是借助栈的'FILO'的特性, 逐步倒序取出尾部节点重新拼接链表 如果借助链表实现, 则需要重点考虑的问题是, 重组链表的过程中, 在何时需要停止 重组的停止条件设定: 1、当链表节点个数为奇数时,顺序遍历的当前节点和逆序遍历的节点相同时,停止。 2、当链表节点个数为偶数时,顺序遍历的下一个节点和逆序遍历的节点相同时,停止。
import utils.ListNode;
import java.util.Stack;
public class Solution {
    public void reorderList(ListNode head) {
        ListNode curr=head;
        Stack<ListNode> stack=new Stack<ListNode>();
        while(head!=null){
            stack.push(head);
            head=head.next;
        }
        while(curr!=null){
            ListNode reorderNode=stack.pop();
            //当链表节点个数为奇数时的退出条件
            if(reorderNode==curr){
                break;
            }
            ListNode tmp=curr.next;//防止链表中断,缓存
            //当链表节点个数为偶数时的退出条件,偶数会出现循环指针的情况,即自身指向自身3->3
            if(curr==tmp){
                break;
            }
            curr.next=reorderNode;//重排,1->4
            curr=curr.next;//cur=4
            curr.next=tmp;//重排,1->4->2
            curr=curr.next;//cur=2
        }
        curr.next=null;//断除尾节点后的无效节点
    }
    public static void main(String[] args) {
        Solution solution=new Solution();
        ListNode head=new ListNode(1);
        ListNode node2=new ListNode(2);
        ListNode node3=new ListNode(3);
        ListNode node4=new ListNode(4);
        head.next=node2;
        node2.next=node3;
        node3.next=node4;
        node4.next=null;
        solution.reorderList(head);
        while(head!=null){
            System.out.print(head.val+"->");
            head=head.next;
        }
        System.out.println();
    }
}时间复杂度:O(N),其中 N 是链表中的节点数。
空间复杂度:O(N),其中 N 是链表中的节点数。主要为栈的内存开销。