JAVA实现单双向链表的增、删、改、查

单向链表

package com.ywx.link;
/**
 * 单向链表
 * @author vashon
 *
 */
public class LinkTest {
    public static void main(String[] args) {
        Link l=new Link();
        l.addNode("A");
        l.addNode("B");
        l.addNode("C");
        l.addNode("D");
        l.addNode("E");
        System.out.println("==========增加之后的内容==========");
        l.printNode();
        System.out.println("\n包含D:"+l.contains("D"));
        System.out.println("==========删除之前的内容==========");
        l.deleteNode("A");
        System.out.println("==========删除之后的内容==========");
        l.printNode();
    }
}
class Link{//链表的完成类
    class Node{//保存每个节点
        private String data;//节点内容
        private Node next;//下一个节点
        public Node(String data){
            this.data=data;
        }
        public void add(Node newNode) {//将节点加入到合适的位置
            if(this.next==null){
                this.next=newNode;
            }else{
                this.next.add(newNode);
            }
        }
        public void print() {//输出节点的内容
            System.out.print(this.data+"\t");
            if(this.next!=null){
                this.next.print();//递归调用输出
            }
        }
        public boolean search(String data){//内部搜索的方法
            if(data.equals(this.data)){
                return true;
            }else{
                if(this.next!=null){//向下继续判断
                    return this.next.search(data);
                }else{
                    return false;
                }
            }
        }
        public void delete(Node previous, String data) {
            if(data.equals(this.data)){//找到了匹配的节点
                previous.next=this.next;//空出当前的节点
            }else{
                if(this.next!=null){
                    this.next.delete(this, data);//继续查找
                }
            }
        }
    }
    private Node root;//链表中的根节点
    public void addNode(String data){//增加节点
        Node newNode=new Node(data);
        if(root==null){
            root=newNode;
        }else{
            root.add(newNode);
        }
    }
    public void printNode(){//链表的输出
        if(root!=null){
            root.print();
        }
    }
    public boolean contains(String name){//判断元素是否存在
        return this.root.search(name);
    }
    public void deleteNode(String data){//链表删除节点
        if(this.contains(data)){
            if(this.root.data.equals(data)){//如果是根节点
                this.root=this.root.next;//修改根节点
            }else{
                this.root.next.delete(root,data);//把下一个节点的前节点和要删除的节点内容一起传入
            }
        }
    }
}

另:

一、JAVA单向链表的操作(增加节点、查找节点、删除节点)

class Link { // 链表类
    class Node { // 保存每一个节点,此处为了方便直接定义成内部类
        private String data; // 节点的内容
        private Node next; // 保存下一个节点

        public Node(String data) { // 通过构造方法设置节点内容
            this.data = data;
        }

        public void add(Node node) { // 增加节点
            if (this.next == null) { // 如果下一个节点为空,则把新节点加入到next的位置上
                this.next = node;
            } else { // 如果下一个节点不为空,则继续找next
                this.next.add(node);
            }
        }

        public void print() { // 打印节点
            if (this.next != null) {
                System.out.print(this.data + "-->");
                this.next.print();
            } else {
                System.out.print(this.data + "\n");
            }
        }

        public boolean search(String data) { // 内部搜索节点的方法
            if (this.data.equals(data)) {
                return true;
            }
            if (this.next != null) {
                return this.next.search(data);
            } else {
                return false;
            }
        }

        public void delete(Node previous, String data) { // 内部删除节点的方法
            if (this.data.equals(data)) {
                previous.next = this.next;
            } else {
                if (this.next != null) {
                    this.next.delete(this, data);
                }
            }
        }
    }

    private Node root; // 定义头节点

    public void addNode(String data) { // 根据内容添加节点
        Node newNode = new Node(data); // 要插入的节点
        if (this.root == null) { // 没有头节点,则要插入的节点为头节点
            this.root = newNode;
        } else { // 如果有头节点,则调用节点类的方法自动增加
            this.root.add(newNode);
        }
    }

    public void print() { // 展示列表的方法
        if (root != null) { // 当链表存在节点的时候进行展示
            this.root.print();
        }
    }

    public boolean searchNode(String data) { // 在链表中寻找指定内容的节点
        return root.search(data); // 调用内部搜索节点的方法
    }

    public void deleteNode(String data) { // 在链表中删除指定内容的节点
        if (root.data.equals(data)) { // 如果是头节点
            if (root.next != null) {
                root = root.next;
            } else {
                root = null;
            }
        } else {
            root.next.delete(this.root, data);
        }
    }
}

测试:

public class TestMain {

    public static void main(String[] args) {
        Link l = new Link();
        l.addNode("A");

        l.addNode("B");
        l.addNode("C");
        l.addNode("D");
        System.out.println("原链表:");
        l.print();
        String searchNode = "B";
        System.out.println("查找节点:" + searchNode);
        String result = l.searchNode(searchNode)?"找到!":"没找到!";
        System.out.println("查找结果:" + result);
        System.out.println("删除节点:" + searchNode);
        l.deleteNode(searchNode);
        System.out.println("删除节点后的链表:");
        l.print();

    }

}

测试结果如下:

原链表:
A-->B-->C-->D
查找节点:B
查找结果:找到!
删除节点:B
删除节点后的链表:
A-->C-->D

原地址

 二、双向链表的简单实现

public class DoubleLink<T> {

    /**
     * Node<AnyType>类定义了双向链表中节点的结构,它是一个私有类, 而其属性和构造函数都是公有的,这样,其父类可以直接访问其属性
     * 而外部类根本不知道Node类的存在。
     *
     * @author ZHB
     *
     * @param <T>
     *            类型
     * @param Data
     *            是节点中的数据
     * @param pre
     *            指向前一个Node节点
     * @param next
     *            指向后一个Node节点
     */
    private class Node<T> {
        public Node<T> pre;
        public Node<T> next;
        public T data;

        public Node(T data, Node<T> pre, Node<T> next) {
            this.data = data;
            this.pre = pre;
            this.next = next;
        }

        public Node() {
            this.data = null;
            this.pre = null;
            this.next = null;
        }
    }

    // 下面是DoubleLinkedList类的数据成员和方法
    private int theSize;
    private Node<T> Header;
    private Node<T> Tail;

    /*
     * 构造函数 我们构造了一个带有头、尾节点的双向链表 头节点的Next指向尾节点 为节点的pre指向头节点 链表长度起始为0。
     */
    public DoubleLink() {

        theSize = 0;
        Header = new Node<T>(null, null, null);
        Tail = new Node<T>(null, Header, null);

        Header.next = Tail;
    }

    public void add(T item) {

        Node<T> aNode = new Node<T>(item, null, null);

        Tail.pre.next = aNode;
        aNode.pre = Tail.pre;
        aNode.next = Tail;
        Tail.pre = aNode;

        theSize++;
    }

    public boolean isEmpty() {
        return (this.theSize == 0);
    }

    public int size() {
        return this.theSize;
    }

    public T getInt(int index) {

        if (index > this.theSize - 1 || index < 0)
            throw new IndexOutOfBoundsException();

        Node<T> current = Header.next;

        for (int i = 0; i < index; i++) {
            current = current.next;
        }

        return current.data;
    }

    public void print() {

        Node<T> current = Header.next;

        while (current.next != null) {

            System.out.println(current.data.toString());

            current = current.next;
        }

    }

    public static void main(String[] args) {
        DoubleLink<String> dLink = new DoubleLink<String>();

        dLink.add("zhb");
        dLink.add("zzb");
        dLink.add("zmy");
        dLink.add("zzj");

        System.out.println("size : " + dLink.size());
        System.out.println("isEmpty? : " + dLink.isEmpty());
        System.out.println("3 : " + dLink.getInt(2));
        dLink.print();
    }
}

 原文地址

时间: 2024-10-12 08:22:22

JAVA实现单双向链表的增、删、改、查的相关文章

Java操作MongoDB:连接&amp;增&amp;删&amp;改&amp;查

1.连接 ①方式一 MongoClientOptions.Builder builder = MongoClientOptions.builder(); //可以通过builder做各种详细配置 MongoClientOptions myOptions = builder.build(); ArrayList<ServerAddress> serverAddressList = new ArrayList(); ServerAddress record = new ServerAddress(

Python---MySQL数据库之四大操作(增 删 改 查)

一.对数据库,表,记录---四大操作(增 删 改 查) 1.操作数据库 (1)对数据库(文件夹):进行增加操作 Create  database  库名; 例:  Create  database  db7 ; 查询库: show  databases; 结果: +-----------------------------+ | Database                   | +----------------------------+ | information_schema | |

ADO.NET 增 删 改 查

ADO.NET:(数据访问技术)就是将C#和MSSQL连接起来的一个纽带 可以通过ADO.NET将内存中的临时数据写入到数据库中 也可以将数据库中的数据提取到内存中供程序调用 ADO.NET所有数据访问技术的基础 连接数据库基本格式:需要两个类1.数据库连接类 SqlConnection2.数据库操作类 SqlCommand 1.连接数据库写连接字符串,立马就要想到有4点要写完,1.连接哪台服务器,2.连接哪个数据库,3.连接用户名,4.密码string sql = "server=.(服务器i

oracle 11g 建库 建表 增 删 改 查 约束

一.建库 1.(点击左上角带绿色+号的按钮) 2.(进入这个界面,passowrd为密码.填写完后点击下面一排的Test按钮进行测试,无异常就点击Connect) 二.建表 1-1. create table 表名1( Tid number(4) --primary key 列级约束(主键), Tname varchar(10) --ont null  非空约束,只能定义在列级约束, Tsex varchar2(2)--check (tsex='男'  or  tsex='女') 检查约束, T

数据库基础学习4--表格的 增 删 改 查(简单查询与高级查询)

一.增 C:create 增加,创建,向数据库里面添加数据. insert into Fruit values('K009','苹果',3.0,'高青',90,'') insert into Fruit(Ids,Name,Price,Source,Numbers) values('K010','苹果',3.0,'高青',90) 二.改 U:update修改,从数据库表里面修改数据. update Fruit set Source='烟台' where Ids='K001' 三.删 D:delet

SQL 增/删/改/查 (总结)

1.增 INSERT  INTO  表名  VALUES (" "," ") ; INSERT INTO 表名(字段)  VALUES(" "); 2. 删 DELETE   FROM 表名  WHERE  ... 3.改 UPDATE  表名 SET   ... WHERE  ... 4.查 SELECT × FROM  表名 ORDER BY ...

1-24.list的增,删,改,查

增: 1.append(通过元素增加,默认加在最后print(a.append('hgf'))) 2.extend( 迭代的去增,就是把字符串的字符逐个去给这个列表加上去) 3.insert((按照索引去增加,前为索引,后为增加的字) 删: 1,pop(通过位置索引去删除) 2.del (通过索引,切片删除) 3.clear(清空列表) 4.remove(通过元素去删除) #返回值是什么意思? 改: a[]='i' print() 查: for i in a: print(a) 其他列表 1.s

php基础:数据库的含义和基本操作 增 删 改 查

//数据库是帮我们管理数据的一个软件,我们将数据给他,放进数据库里.他能很稳妥的帮我们管理起来,且效率很高.//php的大部分工作就是  php->连接数据库->写入数据->查出数据->格式化数据->显示出来,//数据库管理数据是以表的形式组成的,多行多列,表头声明好了,一个表创建好了,剩下的就是往里面添加数据 多张表放在一个文件夹里面就形成了库  mysql服务器帮我们管理多个库C:\wamp\bin\mysql\mysql5.6.12\data   数据库中的数据放在这个

js数组的管理[增,删,改,查]

今天在设计表单的时候遇到对数组的一些处理的问题,比如说怎么创建一个数组,然后牵扯到数组的增删改查的方法.请看API FF: Firefox, N: Netscape, IE: Internet Explorer 方法 描述 FF N IE concat() 连接两个或更多的数组,并返回结果. 1 4 4 join() 把数组的所有元素放入一个字符串.元素通过指定的分隔符进行分隔. 1 3 4 pop() 删除并返回数组的最后一个元素 1 4 5.5 push() 向数组的末尾添加一个或更多元素,