用内部类实现链表的增删改查

public class 链表{
    public static void main(String[] args){
        NodeManager nm = new NodeManager();
        System.out.println("---------------add---------------");
        nm.add(5);
        nm.add(4);
        nm.add(3);
        nm.add(2);
        nm.add(1);
        nm.add(0);
        nm.print();
        System.out.println("--------------del----------------");
        nm.del(3);
        nm.print();
        System.out.println("--------------find----------------");
        System.out.println(nm.find(3));
        System.out.println("--------------update----------------");
        nm.update(2,250);
        nm.print();
        System.out.println("--------------insert----------------");
        nm.insert(4,20);
        nm.print();
        System.out.println(nm.len);
    }
}
class NodeManager{
    private Node root;//根节点
    private int currentIndex = -1;//节点序号,每次操作从-1开始
    public int len = -1;
    //因为外部无法访问内部类,所以需要提供访问内部类方法
    public void add(int data){
        if(root == null){
            len++;
            root = new Node(data);
        }else{
            root.addNode(data);
        }
    }
    public void del(int data){
        if(root==null){
            return;
        }
        if(root.getData()==data){
            root = root.next;//根节点后移
            len--;
        }else{
            root.delNode(data);
        }
    }
    public void print(){
        if(root!=null){
            System.out.print("root:"+root.getData()+"->");
            root.printNode();
            System.out.println("打印完毕");
        }
    }
    //查找是否存在节点
    public boolean find(int data){
        if(root==null) return false;
        if(root.getData()==data)
            return true;
        else{
            root.findNode(data);
        }
        return false;
    }
    public boolean update(int oldData,int newData){
        if(root== null){
            return false;
        }
        if(root.getData()==oldData){
            root.setData(newData);
            return true;
        }else{
            root.updateNode(oldData,newData);
            return false;
        }
    }
    public void insert(int index,int data){
        currentIndex = -1;
            if(index<=len){

                    if(root==null){
                        return;
                    }
                    if(inde x<0){
                        return;
                    }
                    if(index == currentIndex){
                        len++;
                        Node newNode = new Node(data);
                        newNode.next = root;
                        root = newNode;
                    }else{
                        root.insertData(index,data);
                    }
                }
            else{
                System.out.println("请输入正确的长度");
            }
    }
    private class Node{
        private int data;
        private Node next;//把当前类型作为属性
        public Node(int data){
            this.data = data;
        }
        public void setData(int data){
            this.data = data;
        }
        public int getData(){//给外部类用的
            return data;
        }
        //添加节点
        public void addNode(int data){
            if(this.next ==null)
            {
                len++;
                this.next = new Node(data);
            }else{
                this.next.addNode(data);//this是root
            }
        }
        //删除节点
        public void delNode(int data){
            if(this.next!=null){
                if(this.next.data!=data){
                    this.next.delNode(data);
                }else{
                    this.next = this.next.next;
                    len--;
                }
            }
        }
        //输出所有节点
        public void printNode(){
            if(this.next!=null)
            {
                System.out.print(this.next.data+"->");//此处不用getData(),是因为getData是给外部用,而内部可以直接用data
                this.next.printNode();
            }
        }
        //查找节点是否存在
        public boolean findNode(int data){
            if(this.next == null){
                return false;
            }
            if(this.next.data==data){
                return true;
            }else{
                this.next.findNode(data);
            }
            return false;
        }
        //修改节点
        public boolean updateNode(int oldData,int newData){
            if(this.next==null){
                return false;
            }
            if(this.next.data==oldData){
                this.next.data =newData;
                return true;
            }else{
                 this.next.updateNode(oldData,newData);
                 return false;
            }

        }
        //插入节点
        public void insertData(int index,int data){
                currentIndex++;
                if(index  == currentIndex){
                    len++;
                    Node newNode = new Node(data);
                    if(index<len){
                        newNode.next = this.next;
                        this.next = newNode;
                    }else{
                        newNode.next=null;
                        this.next = newNode;
                    }
                }else{
                    this.next.insertData(index,data);//谁调用inserData方法那么this就是谁
                }
        }
    }
}

原文地址:https://www.cnblogs.com/MySweetheart/p/12286947.html

时间: 2024-10-11 18:23:52

用内部类实现链表的增删改查的相关文章

【C】利用单链表数据结构实现通讯录,链表的增删改查

C语言中实现链表,是需要利用到C语言中比较难的结构体与指针才能实现. 结构体中放一个指向后接节点的指针与每一个结点应该存放的信息. 下面做一个命令行的通讯录来说明链表的增删改查这个问题. 一开始让用户输入链表,按1可以输出,按3可以删除. 可以修改: 可以插入. 按0则可以退出: 代码如下: #include<stdio.h> #include<stdlib.h> typedef struct Linklist{ char name[10];//存放名字 char num[10];

数据结构 线性结构(数组[列表] ,链表 单链表的增删改查**, 线性结构的应用 队列 栈[函数的调用**]),非线性结构 树

数据结构 参考:http://lupython.gitee.io/ 线性结构 就是能够用一根线串起来的数据结构 数组 (列表) 问:申请数组的前提条件是啥? a[12]?内存需要满足的条件? 答:内存必须有一块连续的内存空间 int a[7] : 声明一个数组,这个数组的数组名是 a, 数组的大小是 7, 数组元素的类型是整型. int a[7] = array(1,2,3,4,5,6,7) 问:如何申请内存? 答:C,C++语言,申请:mallco (28).释放:free(28) 问:int

Java描述数据结构之链表的增删改查

链表是一种常见的基础数据结构,它是一种线性表,但在内存中它并不是顺序存储的,它是以链式进行存储的,每一个节点里存放的是下一个节点的"指针".在Java中的数据分为引用数据类型和基础数据类型,在Java中不存在指针的概念,但是对于链表而言的指针,指的就是引用数据类型的地址. 链表和数组都是线性的数据结构,对于数组而言其长度是固定的,由于在内存中其是连续的,因此更适合做查找与遍历,而链表在内存中是并不是顺序存储的,但是由于其是通过"指针"构成的,因此在插入.删除时比较数

C++链表,增删改查

// //  main.c //  homework_linkList // //  Created by jiumiao on 15/7/23. //  Copyright (c) 2015年 jiumiao. All rights reserved. // #include <stdio.h> #include <stdlib.h> typedef struct _NPC{ char name[20]; int attack; int hp; }NPC; typedef str

不带头结点的链表的增删改查

这两天都在学习数据结构中的链表操作,觉得有很多东西想跟大家分享,通常写链表一般会创建一个带头结点的链表,带头结点链表非常容易的进行链表的遍历,而不带头结点的链表,一马虎就会指错,所以在这里跟大家分享下我进行没有头结点的创建时的心得! 1.创建无头结点链表(头插) 2.删除中间节点(不是第一个也不是最后一个) 1 #include<stdio.h> 2 #include<malloc.h> 3 typedef char ElemType; 4 typedef struct node

注释最全的C语言链表的增删改查

1 //这是C语言的写法,但会报错,原因是len(当前的节点长度) 2 //无法在insert(插入)和deleted(删除)之后改变 3 //不能使用delete是因为delete是C++中的一个运算符 4 //最终我把改程序用C++写了一遍,运用引用将len的真实值改变了 5 #include <stdio.h> 6 #include <stdlib.h> 7 typedef int ElementType; 8 typedef struct node { 9 ElementT

js 创建链表(增删改查)

话说面试又失败了,今年真是坎坷的一年,女朋友跑了,工作不顺,家里催婚,大学刚毕业,大公司不要.在这个没钱没人的年纪,有点小绝望.不多说直接上代码: /*======定义结构======*/ var node=function(element){ this.element=element this.next=null } var linkedList=function(){ this.head=new node("head") this.find=find this.insert=ins

Java 创建链表,增删改查

项目结构: Node.java: package linkedList; public class Node { int data; Node next; public Node(int data) { this.data = data; this.next = null; } } LinkedList.java: package linkedList; public class LinkedList { private Node first; //指向第一个节点(默认为null) privat

Java实现单向链表的增删改查

class Node { public int val; public Node next; public Node(int val) { this.val = val; } } class ListHead { public int count ; public Node next; public ListHead() { this.count = 0; this.next = null; } } class List { public ListHead head; private Node