|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
windows系统样,他们做了什么事或者留了一些后门程序,谁都不知道,二,java开发是跨平台,任何系统上都可以运行,对于保密型系统和大型系统开发这是必要的
链表是一种主要的数据布局,在程序计划中占据很主要的位置。C言语和C++言语中是用指针来完成链表布局的,因为Java言语不供应指针,以是有人以为在Java言语中不克不及完成链表,实在否则,Java言语比C和C++更简单完成链表布局。Java言语中的对象援用实践上是一个指针(本文中的指针均为观点上的意义,而非言语供应的数据范例),以是我们能够编写如许的类来完成链表中的结点。
classNode
{
Objectdata;
Nodenext;//指向下一个结点
}
将数据域界说成Object类是由于Object类是狭义超类,任何类对象都能够给其赋值,增添了代码的通用性。为了使链表能够被会见还必要界说一个表头,表头必需包括指向第一个结点的指针和指向以后结点的指针。为了便于在链表尾部增添结点,还能够增添一指向链表尾部的指针,别的还能够用一个域来暗示链表的巨细,当挪用者想失掉链表的巨细时,不用遍历全部链表。下图是这类链表的表示图:
链表的数据布局
我们能够用类List来完成链表布局,用变量Head、Tail、Length、Pointer来完成表头。存储以后结点的指针时有必定的技能,Pointer并不是存储指向以后结点的指针,而是存储指向它的前趋结点的指针,当其值为null时暗示以后结点是第一个结点。那末为何要如许做呢?这是由于当删除以后结点后仍需包管剩下的结点组成链表,假如Pointer指向以后结点,则会给操纵带来很年夜坚苦。那末怎样失掉以后结点呢,我们界说了一个办法cursor(),前往值是指向以后结点的指针。类List还界说了一些办法来完成对链表的基础操纵,经由过程使用这些基础操纵我们能够对链表举行各类操纵。比方reset()办法使第一个结点成为以后结点。insert(Objectd)办法在以后结点前拔出一个结点,并使其成为以后结点。remove()办法删除以后结点同时前往其内容,并使厥后继结点成为以后结点,假如删除的是最初一个结点,则第一个结点变成以后结点。
链表类List的源代码以下:
importjava.io.*;
publicclassList
{
/*用变量来完成表头*/
privateNodeHead=null;
privateNodeTail=null;
privateNodePointer=null;
privateintLength=0;
publicvoiddeleteAll()
/*清空全部链表*/
{
Head=null;
Tail=null;
Pointer=null;
Length=0;
}
publicvoidreset()
/*链表复位,使第一个结点
成为以后结点*/
{
Pointer=null;
}
publicbooleanisEmpty()
/*判别链表是不是为空*/
{
return(Length==0);
}
publicbooleanisEnd()
/*判别以后结点是不是
为最初一个结点*/
{
if(Length==0)
thrownewjava.lang.NullPointerException();
elseif(Length==1)
returntrue;
else
return(cursor()==Tail);
}
publicObjectnextNode()
/*前往以后结点的下一个结点的值,
并使其成为以后结点*/
{
if(Length==1)
thrownewjava.util.NoSuchElementException();
elseif(Length==0)
thrownewjava.lang.NullPointerException();
else
{
Nodetemp=cursor();
Pointer=temp;
if(temp!=Tail)
return(temp.next.data);
else
thrownewjava.util.NoSuchElementException();
}
}
publicObjectcurrentNode()
/*前往以后结点的值*/
{
Nodetemp=cursor();
returntemp.data;
}
publicvoidinsert(Objectd)
/*在以后结点前拔出一个结点,
并使其成为以后结点*/
{
Nodee=newNode(d);
if(Length==0)
{
Tail=e;
Head=e;
}
else
{
Nodetemp=cursor();
e.next=temp;
if(Pointer==null)
Head=e;
else
Pointer.next=e;
}
Length++;
}
publicintsize()
/*前往链表的巨细*/
{
return(Length);
}
publicObjectremove()
/*将以后结点移出链表,下一个结点成为以后结点,假如移出的结点是最初一个结点,则第一个结点成为以后结点*/
{
Objecttemp;
if(Length==0)
thrownewjava.util.NoSuchElementException();
elseif(Length==1)
{
temp=Head.data;
deleteAll();
}
else
{
Nodecur=cursor();
temp=cur.data;
if(cur==Head)
Head=cur.next;
elseif(cur==Tail)
{
Pointer.next=null;
Tail=Pointer;
reset();
}
else
Pointer.next=cur.next;
Length--;
}
returntemp;
}
privateNodecursor()
/*前往以后结点的指针*/
{
if(Head==null)
thrownewjava.lang.NullPointerException();
elseif(Pointer==null)
returnHead;
else
returnPointer.next;
}
publicstaticvoidmain(String[]args)
/*链表的复杂使用举例*/
{
Lista=newList();
for(inti=1;i<=10;i++)
a.insert(newInteger(i));
System.out.println(a.currentNode());
while(!a.isEnd())
System.out.println(a.nextNode());
a.reset();
while(!a.isEnd())
{
a.remove();
}
a.remove();
a.reset();
if(a.isEmpty())
System.out.println("ThereisnoNodeinList
");
System.in.println("Youcanpressreturntoquit
");
try
{
System.in.read();
//确保用户看清程序运转了局
}
catch(IOExceptione)
{}
}
}
classNode
/*组成链表的结点界说*/
{
Objectdata;
Nodenext;
Node(Objectd)
{
data=d;
next=null;
}
}
读者还能够依据实践必要界说新的办法来对链表举行操纵。双向链表能够用相似的办法完成只是结点的类增添了一个指向前趋结点的指针。
能够用如许的代码来完成:
classNode
{
Objectdata;
Nodenext;
Nodeprevious;
Node(Objectd)
{
data=d;
next=null;
previous=null;
}
}
固然,双向链表基础操纵的完成略有分歧。链表和双向链表的完成办法,也能够用在仓库和行列的完成中,这里就不再多写了,有乐趣的读者能够将List类的代码略加修改便可。
在ruby里才是一切皆对象。当然我不并不是很了解ruby,但是ruby确实是将语法简化得很好。 |
|