作业三 单链表

来源:互联网 发布:英雄联盟韩服数据库 编辑:程序博客网 时间:2024/06/05 10:32

单链表:
这里写图片描述

 public class  Node{    private  Object  data;    private  Node    next;    //创建空结点    public Node()    {        this(null,null);    }     //创建只有元素,指针为空的结点     public Node(Object obj)     {        this(obj,null);     }     //由元素和指针 创建结点     public Node( Object  obj , Node nt)     {          data=obj ;            next=nt;       }  }——————————————————————————————class LinkList{    Node head;     //4、编写单链表的成员方法,实现对带头结点的单链表的就地逆置。    // 思路:将单链表结点从头到尾依次删除每个结点,再将这个结点用头插法依次插入链表中,形成倒序。    public void reserve()    {        // 首先将链表拆分成两部分,第一部分为空链表,第二部分为元素结点链表。        Node rest = head.next; //rest表示元素结点链表        head.next = null;      //head为空链表         Node p ;               //用于表示待插入结点,每次从rest表示的链表中取第一个结点                while(rest != null )  // rest表示的链表中还有结点,则取一个结点,将其从rest上删除,插入到head链表表头        {            p = rest;            rest = rest.next;            p.next = head.next;            head.next = p;        }    }    //5、编写单链表的成员方法,实现在有序单链表中插入一个新元素,使单链表保持有序性。    // 思路 :待插入元素与表中元素比较大小,确定插入位置,再进行插入操作。    // 注意插入操作需要修改插入结点的先驱结点。       public void insert( Object x )       {           Node p;  //p从首元素开始取值,若小于x,继续向后查找位置,若大于x,则x要插入p结点前。           Node pre; //插入操作需要修改先驱结点,该变量一直取p结点的先驱。           p=head.next;           pre = head;           while(p!=null && p.data.compareTO(x)<0 )           {              pre = p;              p = p.next;           }           //将x插入到pre之后           Node s = new Node(x) ;           s.next = pre.next ;           pre.next = s ;                          }     //该问题也可以只设一个变量pre, 在进行大小比较时,比较pre的后继结点。       public void insert( Object x )       {           Node pre;                    pre = head;           while(pre.next !=null && pre.next.data.compareTo(x)<0 )           {                pre = pre.next;                           }           //将x插入到pre之后           Node s = new Node(x) ;           s.next = pre.next ;           pre.next = s ;                          }    //6、编写单链表的成员方法,实现删除不带头结点的单链表中,删除值为x的第一个结点的操作。     //  删除成功返回被删除结点,删除不成功,返回空。(删除成功返回位置,不成功,返回-1)    //思路:不带头结点的单链表,删除的若是第一个结点,头指针的值会被改写。操作需要注意判断。    //返回值是结点。      public Node remove(Object x )     {         Node p ;         Node temp;         if ( head==null) //空表,返回空              return null;             p = head;          if ( head.data.equals(x))  //x为头结点,删除,并修改头指针         {                              head=head.next;                     return p;          }         else //从第2个结点开始判断         {                            while( p.next!=null )            {            if (p.next.data.equals(x))                    break;            else                    p = p.next;            }            if (p.next==null)  //没找到               return null;            else  //找到,删除            {               temp = p.next;               p.next = temp.next;               return p;             }          }      }    //7、编写单链表的成员方法,实现删除带头结点的单链表中,删除值为x的所有结点,返回被删除的结点数。     public int removeAll ( Object x )     {         Node p,pre;         int total = 0 ;         pre = head;         p = head.next;         while(p!=null)         {              if ( p.data.equals(x)) //p的数据域为x,删除p              {                  pre.next = p.next;                                    p = pre.next;  // 重新赋值p                  total ++;               }               else               {                  pre = p ;                  p = pre.next;                }          }     } }————————————————————————————————————————————————    //8、编写一个多项式类的成员函数,实现将一个用循环链表表示的稀疏多项式分解成两个多项式的操作,    //   使两个多项式中各自含奇次项或偶次项。    //   要求利用原来循环链表中的存储空间构成这两个链表。    // 一元多项式的二元组类,即LinkList的data域类型 , 教材P57      class PolynNode      {         double coef; //系数         int    expn; //指数         public PolynNode (double coef , int expn)         {             this.coef = coef;             this.expn = expn;          }       }      class PolynList  extends LinkList   // 教材P57      {               ....    //   8、编写一个多项式类的成员函数,实现将一个用循环链表表示的稀疏多项式分解成两个多项式的操作,    //   使两个多项式中各自含奇次项或偶次项。    //   要求利用原来循环链表中的存储空间构成这两个链表。          public PolynList  split (  ) // 无参数,返回值为拆分后的奇数项链表,原表为偶数项链表          {               PolynList  A;                A = new PolynList  ();  //A表保存奇次项,新建一个空链表,原表,保存偶次项               // 由于原链表是有序的,因此,取链表上的每个结点,判断奇数项,从原链表中删除,插入A表尾即可。               PolynNode  rearA; // 用尾插法插入,此变量表示A表的表尾               PolynNode  p , pre ; //表示当前结点及其先驱结点               rearA = A.head;               pre = this.head;               p = head.next;               // 取每个结点,进行操作,               //判断其奇偶性,若为奇数项,从原链表中删除,插入A表尾,若为偶数项,留在原链表               while ( p!=null)               {                   if (p.expn %2 == 1)                   {                         pre.next = p.next;                         rearA.next = p;                         rearA = p ;                         p = pre.next;                   }                   else                   {                         pre = p;                         p = p.next;                    }                }               return A;             }               // -------------------------             // 方法首部设计2            public  void split ( PolynList  A , PolynList  B )  //两个形式参数,分别表示两个已初始化的空表           {               //A表保存奇次项,B表,保存偶次项               // 由于原链表是有序的,因此,取链表上的每个结点,判断奇数项,从原链表中删除,插入A表尾即可。               PolynNode  rearA; // 用尾插法插入,此变量表示A表的表尾                    PolynNode  rearB; // 此变量表示B表的表尾               PolynNode  p ; //表示当前结点,               rearA = A.head;               rearB = B.head;               pre = this.head;               p = head.next;               // 取每个结点,进行操作,               //判断其奇偶性,若为奇数项,从原链表中删除,插入A表尾,若为偶数项,从原链表中删除,留在原链表               while ( p!=null)               {                   head.next = p.next;                   if (p.expn %2 == 1)                   {                         rearA.next = p;                         rearA = p ;                    }                   else                   {                         rearB.next = p;                         rearB = p ;                     }                    p = head.next;                }             }
原创粉丝点击