当前位置:首页 » 编程语言 » java链表遍历

java链表遍历

发布时间: 2022-09-27 01:33:38

java 中如何实现链表操作

class Node {
Object data;
Node next;//申明类Node类的对象叫Next

public Node(Object data) { //类Node的构造函数
setData(data);
}
public void setData(Object data) {
this.data = data;
}
public Object getData() {
return data;
}
}

class Link {
Node head;//申明一个Node类的一个对象 head
int size = 0;

public void add(Object data) {
Node n = new Node(data); //调用Node类的构造函数

链表是一种重要的数据结构,在程序设计中占有很重要的地位。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类

的代码稍加改动即可。

❷ 求用Java写的:输入N个整数,按照输入的顺序建立单链表存储,并遍历所建立的单链表,输出这些数据。

importjava.util.Scanner;


publicclassNode{
publicintvalue;
publicNodenext;

publicNode(intvalue){
this.value=value;
this.next=null;
}

publicvoidadd(Nodenode){
this.next=node;
}

publicbooleanhasNext(){
returnthis.next==null?false:true;
}

publicstaticvoidmain(String[]args){
Nodefirst=null;//记录第一个节点,在后面遍历的时候使用
Nodenode=null;//保存当前输入的节点使用

Scannerin=newScanner(System.in);//用于控制台输入,Ctrk+Z结束输入
while(in.hasNext()){
intv=in.nextInt();
Noden=newNode(v);
if(first==null){
first=n;
node=n;
}else{
node.add(n);
node=n;
}
}

if(first==null){
System.out.println("没有数字输入");
}else{
node=first;
System.out.println(node.value+"");
while(node.hasNext()){
node=node.next;
System.out.println(node.value+"");
}
}
}
}

模拟最简单的单链表,临时手打,仅供做题等参考,望采纳。

❸ Java:遍历时数组和链表哪个效率高呢

这个还真有可能,数组是根据基地址和偏移量来算出地址(有乘法和加法运算),然后访问。链接表呢,如:p = p->next;然后用*p访问。按这个说的话,它就一个赋值语句。所以有可能。其实嘛,这个你可以写个算法测一下就好了嘛,不用非得要答案。自己动手写下证明一下就好了。

❹ 有一个单项链表,从第一个节点开始遍历,只允许遍历一遍,用Java程序实现倒序打印所有节点

// 需要借助一个容器
String[] cont = new String[list.size()];
Iterator ite = list.iterator();
int j = list.size() - 1;
while(ite.hasNext() && j > -1){
cont[j] = ite.next();
j--;
}
for(String str: cont){
log.info(str);
}

❺ java单链表遍历,最后会输出一个0,这个零是什么,头指针的引用吗

0是链表最后一个节点的值,也就是你第一个addFirst()时的first的值

❻ 关于java链表的问题,链表的创建,遍历

1. position.link 当前指向节点的下一个节点地址
2. new ListNode(newData, position.link); 下一个节点地址给了新数据,也就是说,将新数据里面存得下一个节点的地址改成当前节点的下一个节点地址。
3. position.link = new什么什么 新数据的地址给了当前地址的记录下一个节点地址变量。

链表存得不应该是自己得地址吧 否则还怎么链。

❼ java单链表遍历,最后会输出一个0,这个零是什么,头指针的引用吗

单链表带头结点的遍历,如果把temp!=null改成temp.next!=null遍历就正常了,但是去掉.next就会多出一个0。这个0是一个未经初始化的内存中“残存”的数字,这一次是零,可能在,下一次运行的时候,里面出现的数字就可能不是0,而是其他不规则的数字。

❽ JAVA 链表问题

while (current != null);
{
【在这里提示current只能为空指针】b.add(current.data);
current = current.next;
}
你的while循环后面多了一个分号,导致while循环是一个空实现,而后面的是一个代码块而已

❾ Java单链表的问题

class Node{ private Object data; private Node next; Node (){} Node (Object data) { this.setData(data); this.setNext(null); } public void setData(Object data){ this.data = data; } public void setNext(Node next){ this.next = next; } public Object getData(){ return this.data; } public Node getNext(){ return this.next; } public String printNode(){ return "节点内的内容为:"+this.getData(); } public boolean equals(Node node){ if(this.getData().equals(node.getData())) return true; else return false; } } class SingleLink{ private Node root; private int size; SingleLink() { this.setSize(); } public void setSize(){ if(this.root==null) { size = 0; } Node temp; temp = this.root; while(temp!=null){ size++; temp = temp.getNext(); } } public int getSize(){ return this.size; } public Node addNode(Node newNode){ if(this.root == null){ this.root = newNode; size++; return this.root; } Node temp = this.root; while(temp.getNext()!=null){ temp = temp.getNext(); } temp.setNext(newNode); size++; return this.root; } public void print(){ if(this.root == null ){ System.out.println("链表不存在!"); } int count=0; Node temp; temp = this.root; while(temp!=null) { System.out.print("第"+(++count)+"个"+temp.printNode()+"->"); temp=temp.getNext(); } System.out.println(); } public boolean search(Object data){ if(this.root == null ){ System.out.println("链表不存在!"); return false; } boolean flag = false; Node temp; temp=this.root; while(temp!=null){ if(temp.getData().equals(data)){ flag = true; break; } temp = temp.getNext(); } return flag; } public void deleteNode(Object data){ if(this.root == null ){ System.out.println("链表不存在!"); } Node temp; temp=this.root; while(temp!=null){ if(temp.getNext().getData().equals(data)){ break; } temp = temp.getNext(); } if(temp==null){ System.out.println("未找到节点!"); } else { temp.setNext(temp.getNext().getNext()); } } } public class LinkDemo{ public static void main(String args[]){ Node node依 = new Node("第依个节点"); Node node贰 = new Node("第贰个节点"); Node node三 = new Node("第三个节点"); Node node四 = new Node("第四个节点"); Node node5 = new Node("第5个节点"); Node node陆 = new Node("第陆个节点"); SingleLink singleLink = new SingleLink(); //System.out.println(singleLink.getSize()); singleLink.addNode(node依); singleLink.addNode(node贰); singleLink.addNode(node三); singleLink.addNode(node四); singleLink.addNode(node5); singleLink.addNode(node陆); //System.out.println(singleLink.getSize()); //singleLink.print(); if(singleLink.search("第漆个节点")) { System.out.println("节点存在!"); } else{ System.out.println("节点不存在!"); } singleLink.deleteNode("第贰个节点"); singleLink.print();

❿ 遍历java集合或数组的几种方式

list集合的遍历3种方法:

[java] view plain
package com.sort;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

/**
* list的三种遍历
* @author Owner
*
*/
public class ListTest {

public static void main(String[] args) {

List<String> list = new ArrayList<String>();

list.add("a");
list.add("b");
list.add("c");
list.add("c");//可添加重复数据

//遍历方法一
for(Iterator<String> iterator = list.iterator();iterator.hasNext();){
String value = iterator.next();

System.out.println(value);
}

//遍历方法二
for(String value : list){
System.out.println(value);
}

//遍历方法三
for(int i=0;i<list.size();i++){
System.out.println(list.get(i));
}

}
}

三种遍历的比较分析:

方法一遍历:
执行过程中会进行数据锁定, 性能稍差, 同时,如果你想在循环过程中去掉某个元素,只能调用it.remove方法。

方法二遍历:
内部调用第一种

方法三遍历:
内部不锁定, 效率最高, 但是当写多线程时要考虑并发操作的问题

List接口的两种主要实现类ArrayList和LinkedList都可以采用这样的方法遍历

关于ArrayList与LinkedList的比较分析
a) ArrayList底层采用数组实现,LinkedList底层采用双向链表实现。
b) 当执行插入或者删除操作时,采用LinkedList比较好。
c) 当执行搜索操作时,采用ArrayList比较好。

热点内容
编程回归线 发布:2024-12-28 04:31:53 浏览:176
医保划拨新配置已报盘是什么意思 发布:2024-12-28 04:26:36 浏览:556
安卓手机如何给苹果手机传送歌曲 发布:2024-12-28 04:22:01 浏览:374
红米4热点密码怎么设置 发布:2024-12-28 04:17:11 浏览:768
c编译器打开文件乱码 发布:2024-12-28 04:17:11 浏览:529
解压后的文件怎么按照名称排列 发布:2024-12-28 03:56:50 浏览:766
内网电脑显示无法连接到服务器 发布:2024-12-28 03:51:26 浏览:240
社保邮政卡初始密码多少 发布:2024-12-28 03:44:16 浏览:158
阴阳师脚本免费 发布:2024-12-28 03:39:50 浏览:23
会务源码 发布:2024-12-28 03:27:11 浏览:190