zoukankan      html  css  js  c++  java
  • 链表操作

    链表操作

    最近在复习数据结构
    让人头疼的 hello 树哥
    从最基础的链表结构来复习吧

    
    interface ILink<E> {
    	public void add(E e);
    	
    }
    class LinkImpl<E> implements ILink<E>{
    	private class Node { //保存节点的数据关系
    		private E data;
    		private Node next;//保存下一个引用
    		public Node (E data) {
    			this.data = data;
    		}
    		//第一次调用:LinkImpl.root.addNode()  this = LinkImpl.root
    		//第二次调用 this = LinkImpl.root.next
    		
    		public  void addNode(Node newNode) { //保存新的node数据
    			if(this.next == null){
    				this.next = newNode;//当前节点的下一个节点为空 保存当前节点
    			}else {
    				this.next.addNode(newNode); // 如果不为空继续调用 知道下一次为为空了 那么保存
    			}
    		}
    		
    	}
    	//------------------
    	private Node root;//根元素
    	public void add(E e) {//link类中定义的方法
    		if (e == null) {
    			return; //方法调用为空
    		}
    		//数据本身 不具有关联性 ,要想关联出来 包装在 node类中
    		Node newNode = new Node(e); //创建一个新节点
    		if(this.root == null ) { //没有根节点
    			this.root = newNode;//那么 第一个节点就是 newNode
    		}else {
    			this.root.addNode(newNode);//保存到合适的位置
    		}
    	
    	}
    }
    class demo01{//链表操作
    	public static void main(String args[]) {
    		ILink<String> all = new LinkImpl<String>();
    		all.add("hello");
    		all.add("work");
    	}
    }
    
    
    

    在这个集合中追加方法

    interface ILink<E> {
    	public void add(E e);
    	public int size();//个数总数
    }
    
    class LinkImpl<E> implements ILink<E>{
    	private class Node { //保存节点的数据关系
    		private E data;
    		private Node next;//保存下一个引用
    		private int count;
    		public Node (E data) {
    			this.data = data;
    		}
    		//第一次调用:LinkImpl.root.addNode()  this = LinkImpl.root
    		//第二次调用 this = LinkImpl.root.next
    		
    		public  void addNode(Node newNode) { //保存新的node数据
    			if(this.next == null){
    				this.next = newNode;//当前节点的下一个节点为空 保存当前节点
    			}else {
    				this.next.addNode(newNode); // 如果不为空继续调用 知道下一次为为空了 那么保存
    			}
    		}
    		
    	}
    	//------------------
    	private Node root;//根元素
    	private int count;
    	public void add(E e) {//link类中定义的方法
    		if (e == null) {
    			return; //方法调用为空
    		}
    		//数据本身 不具有关联性 ,要想关联出来 包装在 node类中
    		Node newNode = new Node(e); //创建一个新节点
    		if(this.root == null ) { //没有根节点
    			this.root = newNode;//那么 第一个节点就是 newNode
    		}else {
    			this.root.addNode(newNode);//保存到合适的位置
    		}
    	this.count ++;
    	}
    	@Override
    	public int size() {
    		// TODO Auto-generated method stub
    		return this.count;
    	}
    }
    class demo01{//链表操作
    	public static void main(String args[]) {
    		ILink<String> all = new LinkImpl<String>();
    		System.out.println(all.size());
    		all.add("hello");
    		all.add("work");
    		System.out.println(all.size());
    	}
    }
    
    

    增加了集合大小的方法简单的 如果下一个节点部位空了 count++


    在增加判断集合为不为空

    interface ILink<E> {
    	public void add(E e);
    	public int size();//个数总数
    	public boolean isEmpty(); // 判断这个集合为不为空
    }
    
    class LinkImpl<E> implements ILink<E>{
    	private class Node { //保存节点的数据关系
    		private E data;
    		private Node next;//保存下一个引用
    		private int count;
    		public Node (E data) {
    			this.data = data;
    		}
    		//第一次调用:LinkImpl.root.addNode()  this = LinkImpl.root
    		//第二次调用 this = LinkImpl.root.next
    		public  void addNode(Node newNode) { //保存新的node数据
    			if(this.next == null){
    				this.next = newNode;//当前节点的下一个节点为空 保存当前节点
    			}else {
    				this.next.addNode(newNode); // 如果不为空继续调用 知道下一次为为空了 那么保存
    			}
    		}
    		
    	}
    	//------------------
    	private Node root;//根元素
    	private int count;
    	public void add(E e) {//link类中定义的方法
    		if (e == null) {
    			return; //方法调用为空
    		}
    		//数据本身 不具有关联性 ,要想关联出来 包装在 node类中
    		Node newNode = new Node(e); //创建一个新节点
    		if(this.root == null ) { //没有根节点
    			this.root = newNode;//那么 第一个节点就是 newNode
    		}else {
    			this.root.addNode(newNode);//保存到合适的位置
    		}
    	this.count ++;
    	}
    	@Override
    	public int size() {
    		// TODO Auto-generated method stub
    		return this.count;
    	}
    	@Override
    	public boolean isEmpty() {
    		// TODO Auto-generated method stub
    		return this.count == 0;
    		//或者 return this.root == null;
    	}
    	
    }
    class demo01{//链表操作
    	public static void main(String args[]) {
    		ILink<String> all = new LinkImpl<String>();
    		System.out.println(all.size());
    		System.out.println(all.isEmpty());
    		all.add("hello");
    		all.add("work");
    		System.out.println(all.size());
    		System.out.println(all.isEmpty());
    	}
    }
    
    

    在增加方法 对链表中数据进行输出

    interface ILink<E> {
    	public void add(E e);
    	public int size();//个数总数
    	public boolean isEmpty(); // 判断这个集合为不为空
    	public Object [] toArray(); //将集合通过数组的方式返回
    }
    
    class LinkImpl<E> implements ILink<E>{
    	private class Node { //保存节点的数据关系
    		private E data;	
    		private Node next;//保存下一个引用
    		public Node (E data) {
    			this.data = data;
    		}
    		//第一次调用:LinkImpl.root.addNode()  this = LinkImpl.root
    		//第二次调用 this = LinkImpl.root.next
    		public  void addNode(Node newNode) { //保存新的node数据
    			if(this.next == null){
    				this.next = newNode;//当前节点的下一个节点为空 保存当前节点
    			}else {
    				this.next.addNode(newNode); // 如果不为空继续调用 知道下一次为为空了 那么保存
    			}
    		}	
    		//根据递归获取数据
    		//第一次调用 this = LinkImpl.root
    		public void toArrayNode(){
    			LinkImpl.this.returnData [LinkImpl.this.foot ++] = this.data;
    			if(this.next != null){//还有下一个数据的话
    				this.next.toArrayNode();
    			}
    		}
    	}
    	//------------------
    	private Node root;//根元素
    	private int count;
    	private int foot; // 追加个脚标
    	private Object [] returnData;//返回的数据保存
    	
    	public void add(E e) {//link类中定义的方法
    		if (e == null) {
    			return; //方法调用为空
    		}
    		//数据本身 不具有关联性 ,要想关联出来 包装在 node类中
    		Node newNode = new Node(e); //创建一个新节点
    		if(this.root == null ) { //没有根节点
    			this.root = newNode;//那么 第一个节点就是 newNode
    		}else {
    			this.root.addNode(newNode);//保存到合适的位置
    		}
    	this.count ++;
    	}
    	//----------------------实现
    	@Override
    	public int size() {
    		// TODO Auto-generated method stub
    		return this.count;
    	}
    	@Override
    	public boolean isEmpty() {
    		// TODO Auto-generated method stub
    		return this.count == 0;
    		//或者 return this.root == null;
    	}
    	@Override
    	public Object[] toArray() {
    		// TODO Auto-generated method stub
    		if(this.isEmpty()) {
    			return null;
    		}
    		this.foot = 0;//脚标清零
    		this.returnData = new Object[this.count];//根据已有的长度开辟数组
    		//根据node类 递归获取数据
    		this.root.toArrayNode();//利用Node类递归数据获取
    		return this.returnData;
    	}
    	
    }
    class demo01{//链表操作
    	public static void main(String args[]) {
    		ILink<String> all = new LinkImpl<String>();
    		System.out.println(all.size());
    		System.out.println(all.isEmpty());
    		all.add("hello");
    		all.add("work");
    		System.out.println(all.size());
    		System.out.println(all.isEmpty());
    		Object res[] = all.toArray();
    		for(Object obj : res){
    			System.out.println(obj);
    		}
    	}
    }
    

    根据索引 获取数据

    interface ILink<E> {
    	public void add(E e);
    	public int size();//个数总数
    	public boolean isEmpty(); // 判断这个集合为不为空
    	public Object [] toArray(); //将集合通过数组的方式返回
    	public E get(int index);//利用索引 取得数据 通过foot
    }
    
    class LinkImpl<E> implements ILink<E>{
    	private class Node { //保存节点的数据关系
    		private E data;	
    		private Node next;//保存下一个引用
    		public Node (E data) {
    			this.data = data;
    		}
    		//第一次调用:LinkImpl.root.addNode()  this = LinkImpl.root
    		//第二次调用 this = LinkImpl.root.next
    		public  void addNode(Node newNode) { //保存新的node数据
    			if(this.next == null){
    				this.next = newNode;//当前节点的下一个节点为空 保存当前节点
    			}else {
    				this.next.addNode(newNode); // 如果不为空继续调用 知道下一次为为空了 那么保存
    			}
    		}	
    		//根据递归获取数据
    		//第一次调用 this = LinkImpl.root
    		public void toArrayNode(){
    			LinkImpl.this.returnData [LinkImpl.this.foot ++] = this.data;
    			if(this.next != null){//还有下一个数据的话
    				this.next.toArrayNode();
    			}
    		}
    		@SuppressWarnings("unused")
    		public E getNode(int index) {
    			if(LinkImpl.this.foot ++  == index) {
    				return this.data;
    			}else {
    				return this.next.getNode(index);
    			}
    		}
    	}
    	
    	//------------------
    	private Node root;//根元素
    	private int count;
    	private int foot; // 追加个脚标
    	private Object [] returnData;//返回的数据保存
    	
    	public void add(E e) {//link类中定义的方法
    		if (e == null) {
    			return; //方法调用为空
    		}
    		//数据本身 不具有关联性 ,要想关联出来 包装在 node类中
    		Node newNode = new Node(e); //创建一个新节点
    		if(this.root == null ) { //没有根节点
    			this.root = newNode;//那么 第一个节点就是 newNode
    		}else {
    			this.root.addNode(newNode);//保存到合适的位置
    		}
    	this.count ++;
    	}
    
    	//----------------------实现
    	@Override
    	public int size() {
    		// TODO Auto-generated method stub
    		return this.count;
    	}
    	@Override
    	public boolean isEmpty() {
    		// TODO Auto-generated method stub
    		return this.count == 0;
    		//或者 return this.root == null;
    	}
    	@Override
    	public Object[] toArray() {
    		// TODO Auto-generated method stub
    		if(this.isEmpty()) {
    			return null;
    		}
    		this.foot = 0;//脚标清零
    		this.returnData = new Object[this.count];//根据已有的长度开辟数组
    		//根据node类 递归获取数据
    		this.root.toArrayNode();//利用Node类递归数据获取
    		return this.returnData;
    	}
    //---------------------
    	@Override
    	public E get(int index) {
    		// TODO Auto-generated method stub
    		if (index > this.count){
    			return null;
    		}//索引的获取 应由node类完成
    		this.foot = 0;//应该通过foot控制脚标
    		return this.root.getNode(index);
    	}
    	
    }
    class demo01{//链表操作
    	public static void main(String args[]) {
    		ILink<String> all = new LinkImpl<String>();
    		System.out.println(all.size());
    		System.out.println(all.isEmpty());
    		all.add("hello");
    		all.add("work");
    		System.out.println(all.size());
    		System.out.println(all.isEmpty());
    		Object res[] = all.toArray();
    		for(Object obj : res){
    			System.out.println(obj);
    		}
    		
    		System.out.println(all.get(1));
    	}
    }
    

    增加新方法 根据索引去set

    interface ILink<E> {
    	public void add(E e);
    	public int size();//个数总数
    	public boolean isEmpty(); // 判断这个集合为不为空
    	public Object [] toArray(); //将集合通过数组的方式返回
    	public E get(int index);//利用索引 取得数据 通过foot
    	public void set(int index,E data);
    }
    
    class LinkImpl<E> implements ILink<E>{
    	
    	//内部node类
    	private class Node { //保存节点的数据关系
    		private E data;	
    		private Node next;//保存下一个引用
    		public Node (E data) {
    			this.data = data;
    		}
    		//第一次调用:LinkImpl.root.addNode()  this = LinkImpl.root
    		//第二次调用 this = LinkImpl.root.next
    		public  void addNode(Node newNode) { //保存新的node数据
    			if(this.next == null){
    				this.next = newNode;//当前节点的下一个节点为空 保存当前节点
    			}else {
    				this.next.addNode(newNode); // 如果不为空继续调用 知道下一次为为空了 那么保存
    			}
    		}	
    		//根据递归获取数据
    		//第一次调用 this = LinkImpl.root
    		public void toArrayNode(){
    			LinkImpl.this.returnData [LinkImpl.this.foot ++] = this.data;
    			if(this.next != null){//还有下一个数据的话
    				this.next.toArrayNode();
    			}
    		}
    		
    		public E getNode(int index) {
    			if(LinkImpl.this.foot ++  == index) {
    				return this.data;
    			}else {
    				return this.next.getNode(index);
    			}
    		}
    		public E setNode(int index,E data) {
    			if(LinkImpl.this.foot ++  == index) {
    				this.data = data;
    			}else {
    				this.next.setNode(index,data);
    			}
    			return data;
    		}
    	}
    	
    	//------------------
    	private Node root;//根元素
    	private int count;
    	private int foot; // 追加个脚标
    	private Object [] returnData;//返回的数据保存
    	
    	public void add(E e) {//link类中定义的方法
    		if (e == null) {
    			return; //方法调用为空
    		}
    		//数据本身 不具有关联性 ,要想关联出来 包装在 node类中
    		Node newNode = new Node(e); //创建一个新节点
    		if(this.root == null ) { //没有根节点
    			this.root = newNode;//那么 第一个节点就是 newNode
    		}else {
    			this.root.addNode(newNode);//保存到合适的位置
    		}
    	this.count ++;
    	}
    
    	//----------------------实现方法
    	@Override
    	public int size() {
    		// TODO Auto-generated method stub
    		return this.count;
    	}
    	@Override
    	public boolean isEmpty() {
    		// TODO Auto-generated method stub
    		return this.count == 0;
    		//或者 return this.root == null;
    	}
    	@Override
    	public Object[] toArray() {
    		// TODO Auto-generated method stub
    		if(this.isEmpty()) {
    			return null;
    		}
    		this.foot = 0;//脚标清零
    		this.returnData = new Object[this.count];//根据已有的长度开辟数组
    		//根据node类 递归获取数据
    		this.root.toArrayNode();//利用Node类递归数据获取
    		return this.returnData;
    	}
    //---------------------
    	@Override
    	public E get(int index) {
    		// TODO Auto-generated method stub
    		if (index > this.count){
    			return null;
    		}//索引的获取 应由node类完成
    		this.foot = 0;//应该通过foot控制脚标
    		return this.root.getNode(index);
    	}
    
    @Override
    public void set(int index, E data) {
    	// TODO Auto-generated method stub
    	if (index > this.count){
    		return ;//方法结束
    	}//索引的获取 应由node类完成
    	this.foot = 0;//应该通过foot控制脚标
    	this.root.setNode(index,data);//修改数据
    }
    	
    }
    class demo01{//链表操作
    	public static void main(String args[]) {
    		ILink<String> all = new LinkImpl<String>();
    		System.out.println(all.size());
    		System.out.println(all.isEmpty());
    		all.add("hello");
    		all.add("work");
    		all.set(1,"java");
    		System.out.println(all.size());
    		System.out.println(all.isEmpty());
    		Object res[] = all.toArray();
    		for(Object obj : res){
    			System.out.println(obj);
    		}
    		
    		System.out.println(all.get(1));
    	}
    }
    

    这种时间复杂度为 N
    遍历 递归

  • 相关阅读:
    分布式文件系统-glusterfs
    Centos7防火墙使用
    Centos7使用Python3
    ldap认证服务的搭建
    kafka使用
    Python基本数据类型
    Linux 内核参数优化
    MHA+atlas(数据库的高可用与读写分离)
    插槽(slot)
    常用组件通信方式
  • 原文地址:https://www.cnblogs.com/laowt/p/14502504.html
Copyright © 2011-2022 走看看