快捷搜索:  as  2018  FtCWSyGV  С˵  test  xxx  Ψһ  w3viyKQx

澳门24小时娱乐在线打造_龟发之家论坛



辽宁省抚顺煤油学院谋略机科学与技巧系 李志刚

链表是一种紧张的数据布局,在法度榜样设计中占领很紧张的职位地方。C说话和C++说话中是用指针来实现链表布局的,因为JAVA说话不供给指针,以是有人觉得在JAVA说话中不能实现链表,着实不然,JAVA说话比C和C++更轻易实现链表布局。JAVA说话中的工具引用实际上是一个指针(本文中的指针均为观点上的意义,而非说话供给的数据类型),以是我们可以编写这样的类来实现链表中的结点。

class Node

{

Object data;

Node next; // 指向下一个结点

}

将数据域定义成Object类是由于Object类是广义超类(所有类的先人),任何类工具都可以给其赋值,增添了代码的通用性。为了使链表可以被造访还必要定义一个表头,表头必须包孕指向第一个结点的指针和指向当前结点的指针。为了便于在链表尾部增添结点,还可以增添一指向链表尾部的指针,别的还可以用一个域来表示链表的大年夜小,当调用者想获得链表的大年夜小时,不必遍历全部链表,下图是这种链表的示意图。

图一 链表的数据布局

我们可以用类List来实现链表布局,用变量Head、Tail、Length、Pointer来实现表头。存储当前结点的指针时有必然的技术,Pointer并非存储指向当前结点的指针,而是存储指向它的前趋结点的指针,当其值为null时表示当前结点是第一个结点。那么我们为什么要这样做呢?这是由于当我们删除当前结点后仍需包管剩下的结点构成链表,假如Pointer指向当前结澳门24小时娱乐在线打造点,则会给操作带来很大年夜艰苦。那么若何获得当前结点呢,我们定义了一个措施cursor(),返回值是指向当前结点的指针。类List还定义了一些措施来实现对链表的基础操作,经由过程运用这些基础操作我们可以对链表进行各类操作。例如reset()措施使第一个结点成为当前结点。insert( Object d )措施在当前结点前插入一个结点,并使其成为当前结点。remove()措施删除当前结点同时返回其内容,并使其后继结点成为当前结点,假如删除的是着末一个结点,则第一个结点变为当前结点。

链表类List的源代码如下:

import java.io.*;

public class List

{

/* 用变量来实现表头 */

private Node Head=null;

private Node Tail=null;

private Node Pointer=null;

private int Length = 0;

public void deleteAll()

/* 清空全部链表 */

{

Head = null;

Tail = null;

Pointer = null;

Length = 0;

}

public void reset()

/* 链表复位,使第一个结点成为当前结点 */

{

Pointer = null;

}

public boolean isEmpty( )

/* 判断链表是否为空 */

{

return( Length == 0 );

}

public boolean isEnd()

/* 判断当前结点是否为着末一个结点 */

{

if ( Length == 0 )

throw new java.lang.NullPointerException();

else if ( Length == 1 )

return true;

else

return( cursor() == Tail );

}

public Object nextNode()

/* 返回当前结点的下一个结点的值,并使其成为当前结点 */

{

if ( Length == 1 )

throw new java.util.NoSuchElementException();

else if ( Length == 0 )

throw new java.lang.NullPointerException();

else

{

Node temp = cursor();

Pointer = temp;

if ( temp != Tail )

return( temp.next.data );

else

throw new java.util.NoSuchElementException();

}

}

public Object currentNode()

/* 返回当前结点的值 */

{

Node temp = cursor();

return temp.data;

}

public void insert( Object d )

/* 在当前结点前插入一个结点,并使其成为当前结点 */

{

Node e = new Node( d );

if ( Length == 0 )

{

Tail = e;

Head = e;

}

else

{

Node temp = cursor();

e.next = temp;

if ( Pointer == null )

Head = e;

else

Pointer.next = e;

}

Length++;

}

public int size()

/* 返回链表的大年夜小澳门24小时娱乐在线打造 */

{

return ( Length );

}

public Object remove()

/* 将当前结点移出链表,下一个结点成为当前结点, 假如移出

的结点是着末一个结点,则第一个结点成为当前结点 */

{

Object temp ;

if ( Length == 0 )

throw new java.util.NoSuchElementException();

else if ( Length == 1 )

{

temp = Head.data;

deleteAll();

}

else

{

Node cur = cursor();

temp = cur.data;

if ( cur == Head )

Head = cur.next;

else if ( cur == Tail )

{

Pointer.next = null;

Tail = Pointer;

reset();

}

else

Pointer.next = cur.next;

Length--;

}

return temp;

}

private Node cursor()

/* 返回当前结点的指针 */

{

if ( Head == null )

throw new java.lang.NullPointerExce澳门24小时娱乐在线打造ption();

else if ( Pointer == null )

return Head;

else

return Poi澳门24小时娱乐在线打造nter.next;

}

public static void main( String[] args )

/* 链表的简单利用举例 */

{

List a = new List();

for ( int i = 1; i <= 10; i++ )

a.insert( new Integer( 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("There is no Node in List

");

System.in.println( " You can press return to quit

" );

try

{

System.in.read(); // 确保用户看清法度榜样运行结果

}

catch( IOException e )

{}

}

}

class Node

/* 构成链表的结点定义 */

{

Object data;

Node next;

Node( Object d )

{

data = d;

next = null;

}

}

读者还可以根据实际必要定义新的措施来对链表进行操作。双向链表可以用类似的措施实现只是结点的类增添了一个指向前趋结点的指针。

我们可以用这样的代码来实现:

class Node

{

Obje澳门24小时娱乐在线打造ct data;

Node next;

Node previous;

Node ( Object d )

{

data = d;

next = null;

previous = null;

}

}

当然双向链表基础操作的实现略有不合,这里就不再胪陈了。链表和双向链表的实现措施,也可以用在客栈和行列步队的实现中,这里就不再多写了,有兴趣的读者可以将List类的代码稍加篡改即可。

参考文献:《收集编程说话JAVA》 孙淑玲、王太权、陈意云

中国科技大年夜学出版社

您可能还会对下面的文章感兴趣: