重排链表

 给定一个单链表L: L0→L1→…→Ln-1→Ln,
重新排列后为:L0→Ln→L1→Ln-1→L2→Ln-2→…
必须在不改变节点值的情况下进行原地操作。
样例

给出链表 1->2->3->4->null,重新排列后为1->4->2->3->null。

import java.util.Scanner;
import java.util.Stack;

/**
 * 给定一个单链表L: L0→L1→…→Ln-1→Ln,
重新排列后为:L0→Ln→L1→Ln-1→L2→Ln-2→…
必须在不改变节点值的情况下进行原地操作。
样例
给出链表 1->2->3->4->null,重新排列后为1->4->2->3->null。
 * 
 * @author Dell
 *
 */
public class Test99 {
  public static void reorderList(ListNode head)
  {
	  if(head==null||head.next==null)
		  return;
	  ListNode temp=new ListNode(-1);
	  temp.next=head;
	  ListNode mid=find(temp);
	  ListNode later=mid.next;
	  mid.next=null;
	  Stack s=new Stack<>();
	  while(later!=null)
	  {
		  ListNode t=later;
		  later=later.next;
		  s.push(t);
	  }
	  ListNode p=temp.next;
	  ListNode q=null;
	  while(s.isEmpty()!=true&&p!=null)
	  {
		  q=p;
		  p=p.next;
		  ListNode zz=s.pop();
		  q.next=zz;
		  zz.next=p;  
	  }
	  
  }
  public static ListNode find(ListNode head)
  {
	  ListNode slow=head.next;
	  ListNode fast=head.next;
	  while(fast.next!=null&&fast.next.next!=null)
	  {
		  slow=slow.next;
		  fast=fast.next.next;		  
	  }
	  return slow;
  }
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		int n=sc.nextInt();
		ListNode head=new ListNode(-1);
		ListNode p=head;
	  for(int i=0;i


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