java中的链表编写

通过while循环取出节点内容

class Node{//定义一个节点类,用于保存数据和取得下一个节点
    private String data;//节点中数据
    private Node next;//下一个节点
    public Node(String data){
        this.data = data;
    }
    public void setNext(Node next){
        this.next = next;
    }
    public Node getNext(){
        return next;
    }
    public String toString(){//取出节点数据
        return this.data;
    }

}
public class Test{
    public static void main(String args[]){
        //1.设置节点内容
        Node root = new Node("根节点");
        Node node1 = new Node("节点1");
        Node node2 = new Node("节点2");
        Node node3 = new Node("节点3");
        //2.设置节点之间的关系
        root.setNext(node1);
        node1.setNext(node2);
        node2.setNext(node3);
        //3.取出节点内容
        Node currentNode = root ; //表示当前节点
        while(currentNode != null){ //当前节点不为空
            System.out.println(currentNode);
            currentNode = currentNode.getNext();//将当前节点设置为下一个节点
        }
    }
}

通过递归调用进行节点的取出

class Node{//定义一个节点类,用于保存数据和取得下一个节点
    private String data;//节点中数据
    private Node next;//下一个节点
    public Node(String data){
        this.data = data;
    }
    public void setNext(Node next){
        this.next = next;
    }
    public Node getNext(){
        return next;
    }
    public String toString(){//取出节点数据
        return this.data;
    }

}
public class Test{
    public static void main(String args[]){
        //1.设置节点内容
        Node root = new Node("根节点");
        Node node1 = new Node("节点1");
        Node node2 = new Node("节点2");
        Node node3 = new Node("节点3");
        //2.设置节点之间的关系
        root.setNext(node1);
        node1.setNext(node2);
        node2.setNext(node3);
        //3.取出节点内容,
        print(root);
    }
    //定义一个递归调用类
        public static void print(Node currentNode){
            if(currentNode == null){
                return;//结束调用
            }
            System.out.println(currentNode);
            print(currentNode.getNext());
        }
}

完善链表客户端调用,简化客户端程序代码

class Node{//定义一个节点类,用于保存数据和取得下一个节点
    private String data;//节点中数据
    private Node next;//下一个节点
    public Node(String data){
        this.data = data;
    }
    //=============================实现节点的添加操作==========================================
    public void addNode(Node newNode){
        //第一次调用addNode的当前对象 this = this.root
        //第二次调用addNode的当前对象 this = this.root.next
        if(this.next == null){ // 当前节点下一个节点不存在
            this.next = newNode;
        }else{ // 下一个节点存在
            this.next.addNode(newNode);
        }
    }
    //=============================实现节点的打印==========================================
    public void printNode(){
        System.out.println(this.data);//输出当前数据
        if(this.next != null){
            this.next.printNode();
        }
    }
}
class Link{
    private Node root;//表示根节点
    //=============================实现节点的添加操作==========================================
    public void add(String data){
        Node newNode = new Node(data);
        if(this.root == null){//根节点不存在
            this.root = newNode;
        }else{//表示根节点已经存在了
            this.root.addNode(newNode);
        }
    }
    //=============================实现节点的打印==========================================
    public void print(){
        if(this.root != null){
            this.root.printNode();
        }
    }
}
public class Test{
    public static void main(String args[]){
        Link link = new Link();
        link.add("根节点");
        link.add("节点1");
        link.add("节点2");
        link.add("节点3");
        link.print();
    }
}

通过内部类的方法对Node类进行封装,只可以被Link类所利用;然后实现链表的增删改查等操作;

public void add(Object obj);      数据的增加

public int size();            取得链表长度

public boolean isEmpty();       判断链表是否为空

public void contains(Object obj);    判断某一数据是否存在

public Object get(int index){}      根据索引取得数据

public void set(int index,Obect obj);  修改指定索引内容

public void remove(Object obj);;    删除指定数据

publci Object [] toArray();       将链表以对象数组的形式返回

范例:以下是相对完整的链表结构

//利用内部类对链表进行开发
class Link{
    private class Node{
        private String data;
        private Node next;
        public Node(String data){
            this.data = data;
        }
    //==========================1.数据增加方法====================================
        public void addNode(Node newNode){
            if(this.next == null){ //1.this = this.root 2.this = this.root.next;...
                this.next = newNode;
            }else{
                this.next.addNode(newNode);    //递归调用
            }
        }
    //==========================4.判断某个内容是否包含在节点之中====================================
        public boolean containsNode(String data){
            if(data.equals(this.data)){
                return true;
            }else{
                if(this.next != null){
                    return this.next.containsNode(data);
                }else{
                    return false;
                }
            }
        }
    //==========================5.根据索引取得数据====================================
        public String getNode(int index){
            if(Link.this.foot++ == index){
                return this.data;
            }else{
                return this.next.getNode(index);
            }
        }
    //==========================6.根据索引替换内容====================================
        public void setNode(int index,String data){
            if(Link.this.foot++ == index){
                this.data = data;
            }else{
                this.next.setNode(index,data);
            }
        }
    //==========================7.删除指定的数据====================================
        public void removeNode(Node preNode,String data){//preNode表示当前节点的前一个节点
            if(data.equals(this.data)){
                preNode.next = this.next;//当前的节点的上一个
            }else{
                this.next.removeNode(this,data);
            }
        }
    //==========================8.将链表变为数组====================================
        public void toArrayNode(){
            Link.this.retArray[Link.this.foot++] = this.data;
            if(this.next != null){
                this.next.toArrayNode();
            }
        }
    }
    //==========================上面显示的是内部类====================================
    private Node root;
    private int count = 0;//表示链表的长度
    private int foot =0;//节点的脚标
    private String[] retArray;//表示返回的数组
    //==========================1.数据增加方法====================================
    public void add(String data){
        Node newNode = new Node(data);
        if(this.root == null){        //表示根节点对象是一个空对象
            this.root = newNode;    //实例化根节点对象
        }else{    //根节点对象已经实例化
            this.root.addNode(newNode);
        }
        if(data != null){
            this.count++;//每一次调用数据count自增一次
        }
    }
    //==========================2.取得链表长度====================================
    public int size(){
        return count;
    }
    //==========================3.判断链表是否是空链表====================================
    public boolean isEmpty(){
        return this.count==0;
    }
    //==========================4.判断某个内容是否包含在节点之中====================================
    public boolean contains(String data){
        if(this.root == null||data == null){
            return false;
        }else{
            return this.root.containsNode(data);
        }
    }
    //==========================5.根据索引取得数据====================================
    public String get(int index){
        this.foot = 0;
        if(this.count <= index){
            return null;
        }else{
            return this.root.getNode(index);
        }
    }
    //==========================6.根据索引替换内容====================================
    public void set(int index,String data){
        this.foot = 0;//重新设置脚标内容
        if(this.count  <= index){
            return ;//结束方法的调用
        }else{
            this.root.setNode(index,data);
        }
    }
    //==========================7.删除指定的数据====================================
    public void remove(String data){
        if(this.contains(data)){ //要删除的数据包含在数据里面
            if(this.root.data.equals(data)){// 删除的是根节点数据
                //根节点要变为原来根节点的下一个节点;
                this.root = this.root.next;
            }else{ //要删除的不是根节点
                this.root.next.removeNode(this.root,data);
            }
            this.count--;
        }
    }
    //==========================8.将链表变为数组====================================
    public String [] toArray(){
        if(this.root == null){
            return null;
        }else{
            this.foot = 0;
            this.retArray = new String[this.count];
            this.root.toArrayNode();
            return this.retArray;
        }
    }
}
public class Test{
    public static void main(String args[]){
        Link link = new Link();
        System.out.println(link.isEmpty());
        link.add("根节点");
        link.add("节点1");
        link.add("节点2");
        link.add("节点3");
        /*
        System.out.println(link.isEmpty());
        System.out.println(link.size());
        System.out.println(link.contains("节点"));
        System.out.println(link.get(3));
        link.set(1,"修改节点内容");
        System.out.println(link.get(1));    //根节点
        */
        /*
        System.out.println(link.get(1));
        System.out.println(link.size());
        link.remove("节点1");
        System.out.println(link.get(1));
        System.out.println(link.size());
        */
        String data[] = link.toArray();
        for(int x=0;x<data.length;x++){
            System.out.print(data[x]+"\t");
        }

    }
}
时间: 2024-11-13 18:45:34

java中的链表编写的相关文章

Java中调用Delphi编写的DLL

有些时候,要写一些程序,在 JAVA 里面好难实现, 但如果使用其它编程语言却又比较容易时,我们不妨通过 JNI 来让不同语言的程序共同完成. JNI 的教程, 网上 C 的比较多,Java 也提供了 javah.exe 为 C 语言的 JNI 程序生成头文件, 如果你是一个 Delphi 编程员, 能否让 JAVA 与 Delphi 程序交互呢? 答案是肯定的,今天我们就来看一下一个简单的例子. Helloworld. 主要是来认识一下, JAVA 怎样调用 Delphi 程序的方法. 好的,

Java中使用AWT编写自己的第三个图形界面,有菜单栏

该程序实现了的功能是出现菜单栏,点击菜单的退出选项就能退出窗体! package com.xywei.awt; import java.awt.Button;import java.awt.FlowLayout;import java.awt.Frame;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.WindowAdapter;import java.awt

Java中使用AWT编写自己的第四个图形界面--简单的记事本

弄了个简单的记事本,能进行简单的打开文件,编辑文件,保存文件,但是怎么都无法解决中文乱码问题,求大家指教…… . package com.xywei.awt; import java.awt.FileDialog;import java.awt.Frame;import java.awt.Menu;import java.awt.MenuBar;import java.awt.MenuItem;import java.awt.TextArea;import java.awt.event.Acti

Java中使用AWT编写自己的第一个图形界面

awt和swing是有区别的,swing是基于重量级awt上的轻量级组件,awt开发图形界面在跨平台方面没有swing好,所以一般使用swind组件比较好! package com.xywei.awt; import java.awt.Button;import java.awt.FlowLayout;import java.awt.Frame;import java.awt.event.WindowAdapter;import java.awt.event.WindowEvent; publi

Java中使用AWT编写自己的第二个图形界面

这个例子插入了文本框,进入按钮,单件按钮,双击按钮等操作事件! package com.xywei.awt; import java.awt.Button;import java.awt.FlowLayout;import java.awt.Frame;import java.awt.TextArea;import java.awt.TextField;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;i

Java中LinkedList的remove方法真的耗时O(1)吗?

这个问题其实来源于Leetcode的一道题目,也就是上一篇日志 LRU Cache.在使用LinkedList超时后,换成ArrayList居然AC了,而问题居然是在于List.remove(Object o)这个方法. 我们知道,链表和数组相比,最主要的特点就是add和remove的操作是O(1)的.Java中的链表一般使用LinkedList这个类型,数组一般使用ArrayList.它们同时implements了List这个interface,所以都有remove(int index)和re

如何在Java中调用Python代码

有时候,我们会碰到这样的问题:与A同学合作写代码,A同学只会写Python,而不会Java, 而你只会写Java并不擅长Python,并且发现难以用Java来重写对方的代码,这时,就不得不想方设法“调用对方的代码”. 下面我将举一些简单的小例子,借此说明:如何在Java中调用Python代码. 看懂这篇文章只需要具备: 熟悉Java的基本语法 懂一点点Python 主要内容如下: 什么是Jython? 一个HelloPython程序 在Jvm中执行Python脚本 仅在Java中调用Python

C#和JAVA中编写事务代码

C#  DAL层代码,执行多条增删改,使用事务操作: /// <summary> /// 执行 多条增删改 (非查询语句) /// </summary> /// <param name="strSql"></param> /// <param name="paras"></param> /// <returns></returns> public static int E

java 中的JDK封装的数据结构和算法解析(集合类)----链表 List 之 LinkedList

List 只要有两个实现类(ArrayList 和linkedList ),ArryList是基于数组实现,LinkedList是基于链表实现,下面是小弟对LinkedList的一点理解: LinkedList :基于链表实现的集合        双链接列表实现{ @code  List}和{ @code   Deque} 接口.实现了所有可选列表操作,和许可元素(including{ @code  null}). 首先对实现的接口分析一下: Deque  (双端队列): 这种队列允许在队列头和