判断一个链表是否为回文结构

来源:互联网 发布:过山车大亨 for mac 编辑:程序博客网 时间:2024/06/05 03:27

import java.util.Stack;//判断一个链表是否为回文结构public class HuiWenList{    //定义链表的节点    public static class Node{    int value;    Node next;    public Node(int data)        {        this.value=data;        }    }     //解法1.数组存储判断一个链表是否为回文链表    public static boolean isHuiWenList(Node head)    {    if(head==null||head.next==null)    {    return true;    }    int leng=0; //记录链表的长度    Node p=head;    while(p!=null)        {        ++leng;        p=p.next;        }        int[]a=new int[leng];  //把链表的值存到数组中        for(int i=0;i<leng&&head!=null;i++)        {        a[i]=head.value;        head=head.next;        }        for(int j=0;j<(leng)/2;j++)        {        if(a[j]!=a[leng-j-1])        {        return false;        }        }         return true;    }    //解法2.栈存储判断一个链表是否为回文链表    public static boolean isHuiWenList2(Node head){       if(head==null||head.next==null)    {    return true;    }    Stack<Node> stack=new Stack<Node>(); //将所有的节点压入一个栈    Node p=head; //指向头结点    while(p!=null)    {    stack.push(p);    p=p.next;        }        while(head!=null)        {        if(head.value!=stack.pop().value)        {        return false;        }        head=head.next;        }        return true;    }   //解法3.栈存储(链表的一半)判断一个链表是否为回文链表    public static boolean isHuiWenList3(Node head){                 if(head==null||head.next==null)    {    return true;    }    Stack <Integer> stack= new Stack<Integer>(); //存储链表节点的值(存储了链表节点数的一半)    Node right=head.next; //指向头的下一个节点    Node cur=head;        //指向头节点    //获得右半部分以right开头    while(cur.next!=null&&cur.next.next!=null)    {    right=right.next;    cur=cur.next.next;    }        while(right!=null)        {        stack.push(right.value);  //存储了链表节点数的一半        right=right.next;        }        while(!stack.isEmpty())        {        if(head.value!=stack.pop())        {        return false;        }        head=head.next;        }    return true;    }         //解法4.(全部反转链表法)判断一个链表是否为回文链表    public static boolean isHuiWenList4(Node head){                  if(head==null||head.next==null)    {    return true;    }    Node t=Reverselist(head);    while(head!=null&&t!=null)    {    if(head.value!=t.value)    {     return false;    }    head=head.next;    t=t.next;    }       return true;     }      //(循环解法)翻转链表    public static Node Reverselist(Node head)     {        if(head==null)        {        return null;        }                Node p=head;       //记录头节点        if(p.next!=null)  //移动第二个节点        {        p=p.next;        }else        {        return head;        }        head.next=null; //头节点的下一个节点指向空        while(p!=null)        {   Node t=p.next;        p.next=head;        head=p;        p=t;        }               return head;     }      //================================================    //解法5.(部分反转)判断一个链表是否为回文链表     public static boolean isHuiWenList5(Node head){                  if(head==null||head.next==null)    {    return true;    }    Node n1=head;    Node n2=head;    //查找中间节点    while(n2.next!=null&&n2.next.next!=null)    {            n1=n1.next;           n2=n2.next.next;    }        n2=n1.next;  //n2->右半部分第一个节点        n1.next=null;        Node n3=null;                //右半部分反转        while(n2!=null)        {        n3=n2.next;   //n3保存以一个节点        n2.next=n1; //下一个反转节点        n1=n2;  //n1移动        n2=n3;  //n2移动        }        n3=n1;  //保存最后一个节点         n2=head;  //指向第一个节点        boolean res=true;        //判断回文        while(n1!=null&&n2!=null)        {        if(n1.value!=n2.value)        {        res=false;        break;        }        n1=n1.next;  //从左到中部        n2=n2.next;  //从右到中部        }        //恢复链表        n1=n3.next;        n3.next=null;        while(n1!=null)        {        n2=n1.next;        n1.next=n3;        n3=n1;        n1=n2;        }        return res;     }public static void main(String[]args){      //System.out.println("Hello");Node node =new Node(1);node.next=new Node(2);        node.next.next=new Node(2);        node.next.next.next=new Node(3);        System.out.println(isHuiWenList(node));        System.out.println(isHuiWenList2(node));        System.out.println(isHuiWenList3(node));        //System.out.println(isHuiWenList4(node));         System.out.println(isHuiWenList5(node));}    }



原创粉丝点击