zoukankan      html  css  js  c++  java
  • 大话数据结构---单链表

    单链表在存储结构上与顺序存储的区别:不用开辟连续的存储空间,存储位置任意,只需要让数据的前驱知道它的位置就可以,而使用单链表示只需要知道单链表的第一个元素就能找到其他所有的元素,为了方便 一般会设置一个头指针指向第一个元素。

    单链表的数据读取:通过头指针一个一个往后遍历

    单链表的插入:

    删除:

    自定义单链表的简单实现:

    package com.neuedu.entity;
    /* 
    * 项目名称:JavaSqList 
    * @author:wzc
    * @date 创建时间:2017年9月2日 上午9:49:00
    * @Description:  自定义单链表
    * @parameter  
    *   */
    public class MyLinkedList {
    	private  Node HeadNode=new Node();  //头结点
    	private  int NodeNum;  //结点个数
        //构造函数
    	public MyLinkedList() {
    		super();
    		NodeNum=0;
    	}
    	//插入操作----插入到链表的末尾
    	public void addNode(int date){
    		Node NewNode=new Node(date);
    		if (NodeNum==0) {
    			HeadNode.next=NewNode;
    		}else {
    			Node tmp=HeadNode;  //每次添加都需要从头结点一次往后找
    			while(tmp.next!=null){
    				tmp=tmp.next;  //找到末尾的结点
    			}
    			tmp.next=NewNode;//将新节点加在末尾结点的后面
    		}
    		NodeNum++;  //结点个数+1
    	}
    	//插入操作,插入到链表的指定位置
    	public void AddNodeIndex(int date,int index){
    		//先判断插入位置是否合法
    		if (index>NodeNum+1) {
    			System.out.println("插入位置越界");
    			return;
    		}
    
    		Node tmp=HeadNode;
    		int j=1;
    		while((tmp.next!=null)&&j<index){//找到第index-1的结点
    			tmp=tmp.next;
    			j++;
    		}
    		Node NewNode=new Node(date);
    		NewNode.next=tmp.next;   //执行插入操作1.
    		tmp.next=NewNode;        //执行插入操作2.
    		NodeNum++;
    		System.out.println("插入成功");
    		
    	}
    	//返回链表长度
    	public int length(){
    		return NodeNum;
    	}
    	//打印结点数据
    	public void printNode(){
    		Node tmp=HeadNode;
    		while(tmp.next!=null){
    			tmp=tmp.next;
    			System.out.print(tmp.date+" ");
    		}
    		System.out.println();//打印完后换行
    	}
    	//删除某个结点
    	public  void deleteNode(int index){
    		//先判断删除的位置是否存在
    		if (index>NodeNum) {
    			System.out.println("删除位置不存在");
    			return;
    		}
    		Node tmp=HeadNode;
    		int j=1;
    		while((tmp.next!=null)&&j<index){//找到第index-1的结点
    			tmp=tmp.next;
    			j++;
    		}
    		Node pNode=tmp.next;
    		tmp.next=pNode.next;
    		NodeNum--;
    		
    	}
    	//判断某个数据是否在链表中
    	public  boolean isExist(int date){
    		Node tmp=HeadNode;
    		while(tmp.next!=null){
    			tmp=tmp.next;
    			if (tmp.date==date) {
    				return true;
    			}
    		}
    		return false;
    	}
    	
    
    }
    
    //链表中的结点类
    class Node{
    	protected int date;
    	protected  Node next=null;
    	
    	public Node() {
    		super();
    	}
    
    	//结点的构造函数
    	public Node(int date) {
    		super();
    		this.date = date;
    	}
    	
    }
    

     单链表结构与顺序存储结构的各自特点

    存储分配方式:

        顺序存储结构用一段连续的存储单元依次存储线性表的数据元素

       单链表:采用链式存储结构,用一组任意的存储单元存放线性表的元素

    时间性能:

    查找:

       顺序表:O(1)

       单链表O(n)

    插入和删除:

      顺序存储结构需要移动数据,时间为O(n)

      单链表:O(1)

    空间性能

    顺序表:预分配存储空间

    单链表:不需要提前分配存储空间

  • 相关阅读:
    python检测服务器端口
    nodejs创建文件
    Git:代码冲突常见解决方法
    爬虫常用库介绍
    关于git提示“warning: LF will be replaced by CRLF”终极解答
    linux系统磁盘使用情况
    tkinter拦截关闭事件
    如何在python中调用C语言代码
    spring in action学习笔记十六:配置数据源的几种方式
    spring in action学习笔记十五:配置DispatcherServlet和ContextLoaderListener的几种方式。
  • 原文地址:https://www.cnblogs.com/Actexpler-S/p/7468211.html
Copyright © 2011-2022 走看看