study
package com.java.duncan;
class Node {
public int value;
public Node next;
public Node() {
value = -1;
next = null;
}
public Node(int i) {
value = i;
next = null;
}
public void add(Node head, Node add) {
Node p = head;
if(p == null) return;
while(p.next != null) {
p = p.next;
}
p.next = add;
}
public void print(Node head) {
Node p = head;
if(p == null) System.out.println("链表为空!");
while(p != null) {
System.out.print(p.value + " ");
p = p.next;
}
}
public void reversePrint(Node node) {
if(node.next != null) {
reversePrint(node.next);
System.out.print(node.value + " ");
}
}
public Node Reverse(Node head) {
if(head==null || head.next==null) return head;
Node p1 = head;
Node p2 = head.next;
Node p3 = p2.next;
p1.next = null;
while(p3 != null) {
p2.next = p1;
p1 = p2;
p2 = p3;
p3 = p3.next;
}
p2.next = p1;
return p2;
}
}
public class ReverseList {
public static void main(String[] args) {
Node head = new Node();
for(int i = 1; i <= 10; i++) {
head.add(head,new Node(i));
}
head.print(head.Reverse(head));
//System.out.println();
//head.reversePrint(head);
}
}
链表是一种重要的数据结构,在程序设计中占有很重要的地位。C语言和C++语言中是用指针来实现链表结构的,由于Java语言不提供指针,所以有人认为在Java语言中不能实现链表,其实不然,Java语言比C和C++更容易实现链表结构。Java语言中的对象引用实际上是一个指针(本文中的指针均为概念上的意义,而非语言提供的数据类型),所以我们可以编写这样的类来实现链表中的结点。
class Node
{
Object data;
Node next;//指向下一个结点
}
将数据域定义成Object类是因为Object类是广义超类,任何类对象都可以给其赋值,增加了代码的通用性。为了使链表可以被访问还需要定义一个表头,表头必须包含指向第一个结点的指针和指向当前结点的指针。为了便于在链表尾部增加结点,还可以增加一指向链表尾部的指针,另外还可以用一个域来表示链表的大小,当调用者想得到链表的大小时,不必遍历整个链表。下图是这种链表的示意图:
链表的数据结构
我们可以用类List来实现链表结构,用变量Head、Tail、Length、Pointer来实现表头。存储当前结点的指针时有一定的技巧,Pointer并非存储指向当前结点的指针,而是存储指向它的前趋结点的指针,当其值为null时表示当前结点是第一个结点。那么为什么要这样做呢?这是因为当删除当前结点后仍需保证剩下的结点构成链表,如果Pointer指向当前结点,则会给操作带来很大困难。那么如何得到当前结点呢,我们定义了一个方法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()
/*返回链表的大小*/
{
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.NullPointerException();
else if(Pointer==null)
return Head;
else
return Pointer.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 \n");
System.in.println("You can press return to quit\n");
try
{
System.in.read();
//确保用户看清程序运行结果
}
catch(IOException e)
{}
}
}
class Node
/*构成链表的结点定义*/
{
Object data;
Node next;
Node(Object d)
{
data=d;
next=null;
}
}
读者还可以根据实际需要定义新的方法来对链表进行操作。双向链表可以用类似的方法实现只是结点的类增加了一个指向前趋结点的指针。
可以用这样的代码来实现:
class Node
{
Object data;
Node next;
Node previous;
Node(Object d)
{
data=d;
next=null;
previous=null;
}
}
当然,双向链表基本操作的实现略有不同。链表和双向链表的实现方法,也可以用在堆栈和队列的实现中,这里就不再多写了,有兴趣的读者可以将List类的代码稍加改动即可。
分享到:
相关推荐
### 《Learn More Study Less》核心知识点概览 #### 标题解读 - **"Learn More Study Less"**:本书的核心理念在于通过高效的学习方法帮助读者在减少学习时间的同时掌握更多的知识。 #### 描述解读 - **尝试改变已...
《Learn More Study Less》电子书是一本专注于如何系统学习一门课程的指导书籍。作者通过自身的经验,结合科学研究和学习方法,提供了一整套高效学习的策略和技术。从书中摘录的引言部分,我们可以了解到,理解事物...
Study通常由一个唯一的Study Instance UID标识,并包含了关于检查的信息,如检查日期、时间、目的等。 3. **Series(序列)**:Series是Study的子集,表示在一次检查中的一系列相关图像。例如,在CT检查中,可能...
EStudy是一款广泛应用于在线学习和教育管理的软件,它提供了丰富的功能,如课程管理、学习资源下载、在线测试等。然而,用户在使用过程中可能会遇到各种问题,其中一种常见的问题就是"3.2EStudy启动后无法显示界面...
AWS has been the frontrunner in cloud computing products and services, and the AWS Certified Solutions Architect Official Study Guide for the Associate exam will get you fully prepared through expert...
"Study ITK Together"的理念鼓励大家共同学习,分享知识,通过集体智慧提升对ITK的理解。 ITK的核心功能包括图像滤波、变形模型、图像配准、分割算法以及图像操作等。在"ITK图像读写详解"部分,我们可以期待学习到...
标题中的"StudyOS学习资料"表明这是一份与操作系统学习相关的资源,特别是针对一个名为"StudyOS"的操作系统。描述中提到的"TQ2440的Linux代码"揭示了这个学习资料可能包括了在三星TQ2440开发板上运行的Linux内核源...
《VB .NET编程实践——基于FIF-study的代码学习》 VB .NET,全称为Visual Basic .NET,是微软公司推出的一种面向对象的、基于.NET框架的编程语言,它继承了Visual Basic的强大易用性,并引入了许多现代编程概念和...
标题中的"1602display-study-study-hard.zip_UP"指的是一个关于1602液晶显示屏学习项目,其中包含了“study study hard!day day up!”的字样,这可能是一个激励学习者的标语或显示示例。这个项目是基于89C52微控制...
【JavaStudy学习项目(代码)】是一个集合了Java学习过程中的各类知识点的代码库,它涵盖了从基础到高级的各种主题,旨在帮助开发者巩固和提升Java编程技能。这个项目包括了基础语法、常用数据结构、算法、设计模式...
"PHP Study"是一款专为PHP开发者设计的集成开发环境,它极大地简化了PHP开发环境的搭建过程,使得用户能够快速地进行PHP项目开发,而无需担心各种配置问题。这款工具集合了Apache服务器、PHP解释器、MySQL数据库等...
CNKI_E-Study阅读软件是一款专为学术研究者和学生设计的在线阅读和文献管理工具。这款软件由中国的中国知网(China National Knowledge Infrastructure)开发,旨在提供方便、高效的学术资源阅读体验。CNKI是中国...
our study sheds light on why Google introduced this practice and analyzes its current status, after the process has been refined through decades of code changes and millions of code reviews....
CNKI E-Study 3.3 是一个专为中国学术研究者设计的论文管理和学习平台,其核心功能在于帮助用户高效地收集、整理、阅读及引用各类学术资源,特别是CNKI(中国知网)上的文献。这个软件的最新版本是3.3,包括两个主要...
知网研学(原E-study)
《GOSTUDY V2.1.3:教育WordPress主题详解》 在互联网时代,教育领域也逐渐走向数字化,各种在线教育平台应运而生。其中,WordPress作为全球最受欢迎的内容管理系统之一,为教育机构提供了丰富的主题选择。今天我们...
A Complete Study System for OCA/OCP Exams 1Z0-803 and 1Z0-804. Prepare for the OCA/OCP Java SE 7 Programmer I and II exams with this exclusive Oracle Press guide. Chapters feature challenging ...
学习研究CNKI E-Study (数字化学习与研究平台) 学者成果库学者圈科研项目 学术趋势搜索互联网学术资源 学术研究热点科研助手,融合中国知网等独家有效资源,开启高校专属资源免费不限量使用。全国高职高专院校招生...