• java基础之自定义单链表练习


    一.单链表

    1.单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象) + 指针(指示后继元素存储位置),元素就是存储数据的存储单元,指针就是连接每个结点的地址数据。

    3.存储

    A.基本数据类型

    首先得有一个类表示链表,只有一个属性记录节点的头地址。

    //链表类
    class MyList{
    	Node head;
    	
    	
    }
    接下来是节点类,属性是data,和next
    class Node{
    	int data;//存储数据
    	Node next;//存储下一个几点对象的地址
    	
    }
    其次是处理逻辑类:

    public class LinkUtil {
        
        
        //只负责存储第一个
        MyList list = new MyList();
        //初始化链表对象,将其head存储第一个对象的地址
        void intiList(){
            list.head = null;
        }
        
        
        
        void add(int date){
            //创建一个节点
            Node node= new Node();
            //给节点两个属性赋值
            node.data = date;
            node.next = list.head;
            //将第一父个节点 对象地址赋值给链表对象的head
            list.head = node;
            
            
        }
        void delete(int data){
            //删除第一个节点对象
            if(list.head.data==data){
                list.head=list.head.next;
                return;
            }
            //第二种
            Node p=list.head;
            Node ppre = null;//ppre指向p的前一个节点
            while(p!=null){
                ppre = p;
                p=p.next;
                if(p.data==data){
                    ppre.next=p.next;
                    break;
                }
                
            }
            
            
            
        }
        //展示数据
        void showAllNode(){
            //p指向第一个节点对象
            Node p = list.head;
    
            while(p!=null) {
                System.out.println(p.data);
                p = p.next;
            }
            
        }
        //修改数据
        void exchange(int data,int newData){
            Node p = list.head;
            while(p!=null){
                if(p.data==data){
                    p.data = newData;
                    break;
                }
                p = p.next;
            }
            /*if(p==null){
                System.out.println("修改的值不存在!");
            }*/
        }
    }
    测试界面:
    package com.se.link;
    
    public class MyListTest {
        public static void main(String[] args) {
            LinkUtil l = new LinkUtil();
            l.intiList();
            l.add(3);
            l.add(4);
            l.add(5);
            l.add(31);
            l.add(41);
            l.add(51);
            //l.exchange(12, 331);
            //l.delete(3);
            l.showAllNode();
            
        }
    
    }
    

    B.存储自定义对象

    原理类似,在节点数据域存放的现在是对象的地址,拿到数据域有必要去转型。

    package com.se.link;
    
    public class ListStudent {
    	
    	//只负责存储第一个
    	MyList1 list = new MyList1();
    	//初始化链表对象,将其head存储第一个对象的地址
    	void intiList(){
    		list.head = null;
    	}
    	
    	void add(Student stu){
    		//创建一个节点
    		Node1 node= new Node1();
    		//给节点两个属性赋值
    		node.msg = stu;
    		node.next = list.head;
    		//将第一父个节点 对象地址赋值给链表对象的head
    		list.head = node;
    		
    		
    	}
    	//按姓名删除
    	void delete(String name){
    		Node1 p=list.head;
    		//删除第一个节点对象
    				Student stu = p.msg;
    				if(name.equals(stu.getName())){
    					list.head=list.head.next;
    						return;
    						}
    		
    		//第二种删除非第一个节点
    		
    		Node1 ppre = null;//ppre指向p的前一个节点
    		while(p!=null){
    			ppre = p;
    			p=p.next;
    			Student stu1 =p.msg;
    			if(name.equals(stu1.getName())){
    				ppre.next=p.next;
    				break;
    			}
    			
    		}
    		
    		
    		
    	}
    	//展示数据
    	void showAllNode(){
    		//p指向第一个节点对象
    		Node1 p = list.head;
    		while(p!=null) {
    			Student stu =p.msg;
    			System.out.println(stu.getName()+":"+stu.getAge());
    			p = p.next;
    		}
    		
    	}
    	// 修改姓名修改数据
    	void exchange(String name,String newName){
    		Node1 p = list.head;
    		while(p!=null){
    			Student stu =p.msg;
    			if(name.equals(stu.getName())){
    				stu.setName(newName);
    				break;
    			}
    			p = p.next;
    		}
    		if(p==null){
    			System.out.println("修改的名字不存在!");
    		}
    	}
    }
    
    //节点类
    class Node1{
    	Student msg;//存储数据
    	Node1 next;//存储下一个几点对象的地址
    	
    }
    //链表类
    class MyList1{
    	Node1 head;
    	
    }
    class Student{
    	String name;
    	int age;
    	public Student(){}
    	public Student(String name,int age){
    		this.name = name;
    		this.age = age;
    	}
    	public String getName() {
    		return name;
    	}
    	public void setName(String name) {
    		this.name = name;
    	}
    	public int getAge() {
    		return age;
    	}
    	public void setAge(int age) {
    		this.age = age;
    	}
    	
    }
    测试界面:
    package com.se.link;
    
    public class ListStudentTest {
        public static void main(String[] args) {
            
            ListStudent stu = new ListStudent();
            stu.add(new Student("小明",18));
            stu.add(new Student("小刚",22));
            stu.add(new Student("小强",34));
            stu.add(new Student("老王",54));
            stu.exchange("小明", "李白");
            stu.delete("小刚");
            stu.showAllNode();
            
        }
    
    }
    注意,增加节点主要是运用链表的头插法。
    
    
    





  • 相关阅读:
    临时文件服务器,配置共享文件夹
    封装扩展方法
    List.Insert
    VS 生成事件中xcopy失败
    创建型设计模式总结
    js提交图片转换为base64
    C#建造者模式
    echarts 立体柱
    k8s生产环境启用防火墙,要开启的端口
    一篇文章为你图解Kubernetes网络通信原理
  • 原文地址:https://www.cnblogs.com/jatpeo/p/11767579.html
Copyright © 2020-2023  润新知