java链表基本概念

版权声明:啦啦啦 https://blog.csdn.net/qq_37199582/article/details/79244657

    链表是一种根据元素节点逻辑关系排列起来的一种数据结构。利用链表可以保存多个数据,这一点类似于数组的概念,但是数组本身有一个缺点—— 数组的长度固定,不可改变,在长度固定的情况下首选的肯定是数组,但是在现实的开发之中往往要保存的内容长度是不确定的,那么此时就可以利用链表这样的结构来代替数组的使用。

 

    链表是一种最为简单的数据结构,它的主要目的是依靠引用关系来实现多个数据的保存,那么下面假设现在要保存的数据是字符串(引用类型),则可以按照图所示的关系进行保存。


//每一个链表实际上就是由多个节点组成的
public class Node {    //定义一个节点
  private String data; //用于保存数据
  private Node next;   //用于保存下一个节点
  //每一个Node类对象都必须保存有响应的数据
  public Node(String data){
	  this.data = data ;
  }
  public void setNext(Node next){
	  this.next = next ;
  }
  public Node getNext(){
	  return this.next ;
  }
  public String getData(){
	  return this.data ;
  }
}

以上只是一个专门用来保存节点关系的类,要通过其它方法将所有节点链接起来

Ø  在进行链表操作的时候,首先需要的是一个根节点(第一个节点即为根节点),之后每一个节点的引用都保存在上一节点的next属性之中,而在进行输出的时候也应该按照节点的先后顺序,一个一个取得每一个节点所包装的数据

public class LinkDemo {

	public static void main(String[] args) {
		//第一步:准备数据
		Node root = new Node("火车头") ;
		Node n1 = new Node("车厢A") ;
		Node n2 = new Node("车厢B") ;
		
		root.setNext(n1);
		n1.setNext(n2);
		
		//第二步:取出所有数据
		Node currentNode = root ;//从当前根节点开始读取
		while( currentNode !=  null){
			System.out.println(currentNode.getData()) ;
			//将下一个节点设置为当前节点s
			currentNode = currentNode.getNext() ;
		}

这样,就将他们链接起来了,但是这样的操作在实际使用中很不方便,最好的方法是递归操作完成

利用递归操作链接节点

public class LinkDemo {

	public static void main(String[] args) {
		//第一步:准备数据
		Node root = new Node("火车头") ;
		Node n1 = new Node("车厢A") ;
		Node n2 = new Node("车厢B") ;
		
		root.setNext(n1);
		n1.setNext(n2);
		print(root);
		/*		//第二步:取出所有数据
		Node currentNode = root ;//从当前根节点开始读取
		while( currentNode !=  null){
			System.out.println(currentNode.getData()) ;
			//将下一个节点设置为当前节点s
			currentNode = currentNode.getNext() ;
*/
		
	}

		private static void print(Node current) {
			if( current == null ){//递归结束条件
				return ; 
			}
				System.out.println(current.getData()) ;
				print( current.getNext() );
			}
		}

这样就方便很多了,那么还有什么问题呢?

显然是主方法中配置关系的语句过多,主方法不像一个大管家管理所有的类了,所以要定义一个类,用来专门进行数据间关系的处理,而主方法负责管理就可以了

完整代码

//每一个链表实际上就是由多个节点组成的
public class Node { // 定义一个节点
	private String data; // 用于保存数据
	private Node next; // 用于保存下一个节点
	// 每一个Node类对象都必须保存有响应的数据

	public Node(String data) {
		this.data = data;
	}

	public void setNext(Node next) {
		this.next = next;
	}

	public Node getNext() {
		return this.next;
	}

	public String getData() {
		return this.data;
	}

	// 实现节点的添加
	// 第一次调用(Link):this代表Link.root
	// 第二次调用(Node):this代表Link.root.next
	// 第三次调用(Node):this代表Link.root.next.next
	public void addNode(Node newNode) {
		if (this.next == null) { // 如果只有一个节点
			this.next = newNode; // 保存新节点
		} else { // 当前节点后面还有节点
			// 当前节点的下一个节点继续保存
			this.next.addNode(newNode);

		}
	}

	// 第一次调用(Link):this代表Link.root
	// 第二次调用(Node):this代表Link.root.next
	// 第三次调用(Node):this代表Link.root.next.next
	public void printNode() {
		System.out.println(this.data);// 输出当前数据
		if (this.next != null) {// 如果还有下一个节点
			this.next.printNode();// 输出下一节点
		}
	}
}
public class LinkDemo {

	public static void main(String[] args) {
	 Link link = new Link() ;
	 link.add("hello");   //存放数据
	 link.add("world");
	 link.add("wwww");
	 link.print();     //展示数据
		
	}
	
}
//负责数据的设置和输出
public class Link {
	private Node root; //根节点
//增加数据
  public void add (String data){
	  //为了设置数据的先后关系,所以将data包装在一个Node类对象
	  Node newNode = new Node(data);
	  if(this.root == null ){  //一个链表只有一个根节点
		  this.root = newNode;  //将新的节点设置为根节点
	  }else{  
		  //从root节点后找到合适的位置
		  this.root.addNode(newNode);
	  }
  }
  
  //输出数据
  public void print(){
	  if( this.root != null ){
		  this.root.printNode();
	  }
  }
  
}







阅读更多
换一批

没有更多推荐了,返回首页