zoukankan      html  css  js  c++  java
  • Java数据结构之单链表

    这篇文章主要讲解了通过java实现单链表的操作,一般我们开始学习链表的时候,都是使用C语言,C语言中我们可以通过结构体来定义节点,但是在Java中,我们没有结构体,我们使用的是通过类来定义我们所需要的节点,链表。

    下面我主要说明5个操作:增加元素(两种),查找元素,更新元素,删除元素,遍历单链表中的元素。

    第一部分.单链表的介绍

    在我们平时的使用中,通过数组我们可以快速的存储元素,链表也是和数组一样可以用来存储元素,但是链表在一些方面比数组的效率更高,在查找元素的时候我们通常用数组来存储,但是当我们插入和删除元素的时候,通常我们使用链表来进行操作。链表我们通常定义有两个域:数据域和指针域。数据域存储的是我们要存储的数据,指针域存储的是我们要指向下一个地址的指针。

    单链表的存储方式:单链表的存储方式如下:

    单链表的每个元素的存储空间不是连续的,我们只能通过第一个数据的指针找到下一个元素的位置,之后才能进行访问。这里面在链表中我们通常加一个head(头指针),这个头指针可以方便我们对链表头元素的插入和删除,它仅仅代表一个标志,里面可以写上链表的长度等等。

    带表头的单链表的逻辑示意图如下:

    第二部分.单链表的操作

    节点的创建:

    class HeroNode{
    	public int no;
    	public String name;
    	public String nickname;
    	public HeroNode next;
    	
    	public HeroNode(int no,String name,String nickname){
    		this.no = no;
    		this.name = name;
    		this.nickname = nickname;
    	}
    	public String toString(){
    		return "HeroNode[no="+no+"\t"+"name="+name+"\t"+"nickname="+nickname+"]";
    	}
    }
    

    单链表的创建(我会在这里面加入各种操作,通过注释讲解)

    class LinkedList{
    	//创建头结点,将第一个头结点定义成私有的。
    	private HeroNode head = new HeroNode(0,"","");
    	//返回头结点,这里面直接调用get,set即可。
    	public HeroNode getHead() {
    		return head;
    	}
    
    	//在链表的最后添加元素
    	public void add(HeroNode heronode){
    		//找一个辅助变量temp来遍历
    		HeroNode temp = head;
    		while(true){
    			if(temp.next == null){
    				break;
    			}
                            //这个地方要注意,每次都要往后移一个单位,否则就是死循环了。
    			temp = temp.next;
    		}
    		temp.next = heronode;
    		
    	}
    	//在链表中按照编号的顺序添加
    	public void addOrderBy(HeroNode heronode){
    		HeroNode temp = head;
    		boolean flag = false;
    		while(true){
    			if(temp.next == null){
    				break;
    			}
    			if(heronode.no<temp.next.no){
    				break;
    			}else if(heronode.no == temp.next.no){
    				flag = true;
    				break;
    			}
    			temp = temp.next;
    		}
    		
    		if(flag){
    			System.out.println("编号已经存在,不能添加");
    			return;
    		}else{
                            //在链表中插入元素的步骤,重点代码!!!
    			heronode.next = temp.next;
    			temp.next = heronode;
    		}
    		
    	}
    	//在链表中根据编号修改元素,相当于就是查找
    	public void update(int no){
    		HeroNode temp = head.next;
    		boolean flag = false;
    		while(true){
    			if(temp.next == null){
    				break;
    			}
    			if(temp.no == no){
    				flag = true;
    				break;
    			}
    			temp = temp.next;
    		}
    		if(flag){
    			temp.name = "xiao";
    			temp.nickname = "xiao";
    		}else{
    			System.out.println("没有找到要修改的元素");
    			return;
    		}
    	}
    	//在链表中根据编号删除元素
    	public void del(int no){
    		boolean flag = false;
    		if(head.next == null){
    			System.out.println("该链表为空");
    			return;
    		}
    		HeroNode temp = head;
    		while(true){
    			if(temp.next == null){
    				break;
    			}
    			if(temp.next.no == no){
    				flag = true;
    				break;
    			}
    			temp = temp.next;
    		}
    		if(flag){
                            //链表中删除元素的重要步骤!!!
    			temp.next = temp.next.next;
    		}else{
    			System.out.println("没有找到待删除元素的编号");
    			return;
    		}
    		
    		
    		
    	}
    	//遍历链表,显示链表中的每个元素
    	public void list(){
    		if(head.next == null){
    			System.out.println("该链表中的元素为空");
    			return;
    		}else{
    			HeroNode temp = head.next;
    			while(true){
    				if(temp == null){
    					break;
    				}
    				System.out.println(temp);
    				temp = temp.next;
    				
    				
    			}
    		}
    	}
    }                    
    

    以上就是单链表的增删改查的操作,如果有问题可以留言~  

  • 相关阅读:
    Vue之axios基础使用
    Vue + Spring Boot 项目实战(二):使用 CLI 搭建 Vue.js 项目
    解决:'webpack-dev-server' 不是内部或外部命令,也不是可运行的程序 或批处理文件。
    CentOS root用户修改只读文件时提示加! 解决办法
    CentOS 7 源码编译安装 Redis
    CentOS安装Jdk并配置环境变量
    Vue + Spring Boot 项目实战(一):项目简介
    druid 数据源 使用属性文件的一个坑
    scala 学习笔记(07) 一等公民的函数
    linux:手动校准系统时间和硬件CMOS时间
  • 原文地址:https://www.cnblogs.com/liuzengzhi/p/11726144.html
Copyright © 2011-2022 走看看