5. 面对对象(基础) Part 4 --- 学习笔记

5.15 实例讲解
     1. 单向链表的实现(1)
        单项链表表示如图:
           
class PriNode{
     private String data;
     private PriNode next;

     //Constructor
     public PriNode(String data){
          this.data = data;
     }
     public String getData(){
          return this.data;
     }
     public void  setNext(PriNode next){
          this.next = next;
     }
     public PriNode getNext(){
          return this.next;
     }
}

public class TestPriNode(){
     public static void main(String args[]){
          // set a new link list
          PriNode root = new PriNode("Train Head");
          PriNode node1 = new PriNode("Train One");
          PriNode node2 = new PriNode("Train Two");
          PriNode node3 = new PriNode("Train Three");
          PriNode node4 = new PriNode("Train Four");
          root.setNext(node1);
          node1.setNext(node2);
          node2.setNext(node3);
          node3.setNext(node4);

          //print the link out
          printNode(root);    
     }

     public static void printNode(PriNode node){
          System.out.print(node.getData + "\t\t");
          if (node.getNext() != null){
               printNode(node.getNext());
          }
     }
}

     2. 单向链表的实现(2)
        链表的增加:直接增加到链表的结尾处。
        链表的删除:需作如下图所示的处理
               
注意到,这里用到了内部类来处理node.
 *****打印节点都是从根节点开始打印的。所以这里的代码的切入点都是从根节点!  我要的就是这种思想!!!! *****
需要注意的是编写代码的顺序,个人见解,代码的编写顺序也可以增强逻辑性,so, 以增加节点为例
1. 增加节点:   第一步编写颜色部分,第二步颜色部分,第三步颜色部分,第四步颜色部分,第五步颜色部分
2. 增加节点后,接着就是打印节点来验证是否正确,所以就需要新增打印节点方法printNode.  第六步颜色部分
3. 有了链表后,进行删除操作(第七步颜色部分),查找操作。
class PriLink{
        class PriNode(){
                private String data;
                private PriNode next;
                public PriNode(String data){
                        this.data = data;
                }

                public void add(PriNode newNode){
                        if (this.next == null){
                                this.next = newNode;
                        }else {
                                this.next.add(newNode);
                        }
                }

                //*****print node part III*****
                public void print(){
                        System.out.print(this.data +"\t\t");
                        if (this.next != null){
                                this.next.print();
                        }
                }

                //***** delete node part IV*****
                public boolean search(String data){  //NOTE: Here contains 字符串的比较方法!!!
                        if (data.equals(this.data)){
                                return true;
                        }else {
                                if(this.next !=null){
                                        return this.next.search(data);
                                }else{
                                        return false;
                                }
                }
        
                //*****delete node part VI *****
                public void delete(PriNode previous, String data){
                        if (data.equals(this.data)){                                  //找到了匹配的节点
                                previous.next = this.next;                           //空出当前节点
                        } else {
                                if(this.next != null){
                                        this.next.delete(this, data);                 //继续向下找
                                }
                        }
                }

        }

        private PriNode root;

        public addNode(String data){
                PriNode newNode = new PriNode(data);
                if (this.root == null){
                        this.root = newNode;
                }else {
                        this.root.add(newNode)
                }

        }

        //*****delete node part III*****
        public boolean contains(String name){              //判断元素是否存在
                return this.root.search(name);                   //调用PriNode类中的search方法。
        }


        // ***** delete node part II*****
        public deleteNode(String data){
                if (this.contains(data)){                                 //如果节点存在,则执行操作
                        // *****delete node part V*****
                        if (this.root.data.equals(data)){             //判断根节点是否满足条件
                                this.root = this.root.next;               //将根节点之后的那个节点设置为新的根节点
                        }else{
                                this.root.next.delete(root, data);       //删除节点
                        }

                }
        }


        //*****print node part II*****
        public printNode(){
                if (this.root != null){
                        this.root.print();
                }
        }

}

public class LinkTest{
        public static void main(String args[]){
                PriLink pl = new PriLink();
                pl.addNode("A");                                           //add node A,B,C,D,E
                pl.addNode("B");
                pl.addNode("C");
                pl.addNode("D");
                pl.addNode("E");

                //*****print node part I*****
                pl.printNode();                               //print the link out to check that if add function works fine or not.

                // *****delete node part I*****
                pl.deleteNode("D");                                       //delete one node that exists in the link list
                pl.printNode();
                pl.deleteNode("c");                                        //try to delete node that does not exists in the link list.
                pl.printNode();
                

        }
}

课后思考:
上面的实现二中,有如下问题:
     删除操作,先判断元素是否存在时,比较了链表的data是否相符,但是在真正执行删除操作调用delete方法时,里面又比较了链表的data! 这与search里面比较data算是重复操作么??可以在search里面比较data的时候直接返回PriNode对象么?这样性能是不是更好点呢???!!!  我是个菜鸟初学者,还解决不了啊,先mark下,到后面看能不能发飚解决~~


技术选型 【后端】:Java 【框架】:springboot 【前端】:vue 【JDK版本】:JDK1.8 【服务器】:tomcat7+ 【数据库】:mysql 5.7+ 项目包含前后台完整源码。 项目都经过严格调试,确保可以运行! 具体项目介绍可查看博主文章或私聊获取 助力学习实践,提升编程技能,快来获取这份宝贵的资源吧! 在当今快速发展的信息技术领域,技术选型是决定一个项目成功与否的重要因素之一。基于以下的技术栈,我们为您带来了一份完善且经过实践验证的项目资源,让您在学习和提升编程技能的道路上事半功倍。以下是该项目的技术选型和其组件的详细介绍。 在后端技术方面,我们选择了Java作为编程语言。Java以其稳健性、跨平台性和丰富的库支持,在企业级应用中处于领导地位。项目采用了流行的Spring Boot框架,这个框架以简化Java企业级开发而闻名。Spring Boot提供了简洁的配置方式、内置的嵌入式服务器支持以及强大的生态系统,使开发者能够更高效地构建和部署应用。 前端技术方面,我们使用了Vue.js,这是一个用于构建用户界面的渐进式JavaScript框架。Vue以其易上手、灵活和性能出色而受到开发者的青睐,它的组件化开发思想也有助于提高代码的复用性和可维护性。 项目的编译和运行环境选择了JDK 1.8。尽管Java已经推出了更新的版本,但JDK 1.8依旧是一种成熟且稳定的选择,广泛应用于各类项目中,确保了兼容性和稳定性。 在服务器方面,本项目部署在Tomcat 7+之上。Tomcat是Apache软件基金会下的一个开源Servlet容器,也是应用最为广泛的Java Web服务器之一。其稳定性和可靠的性能表现为Java Web应用提供了坚实的支持。 数据库方面,我们采用了MySQL 5.7+。MySQL是一种高效、可靠且使用广泛的关系型数据库管理系统,5.7版本在性能和功能上都有显著的提升。 值得一提的是,该项目包含了前后台的完整源码,并经过严格调试,确保可以顺利运行。通过项目的学习和实践,您将能更好地掌握从后端到前端的完整开发流程,提升自己的编程技能。欢迎参考博主的详细文章或私信获取更多信息,利用这一宝贵资源来推进您的技术成长之路!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值