使用java实现双向链表数据结构

今天到xxxx公司面试,前面的一些题目都是网上的一些面试题,最后一题考察的是数据结构,让介绍大学里学习的数据结构,并用代码实现链表的增加,删除,查询。这个之前在写练习时,写过链表的Demo,但是在这个关键时刻却忘了,不知道该怎么写,回来之后翻开之前写的代码重新看了一遍,在这里,我把我之前写的代码粘贴出来,供大家学习,希望大家能有所收获:

package link;

public class Link {
	
	/**
	 * 保存每一个节点,此处为了方便直接定义成内部类 
	 * @author binchen
	 *
	 */
	class Node{
		private String data;
		private Node next; //保存下一个节点
		
		public Node(){}
		public Node(String data){
			this.data = data; //通过构造方法设置节点内容
		}
		public String getData() {
			return data;
		}
		public void setData(String data) {
			this.data = data;
		}
		public Node getNext() {
			return next;
		}
		public void setNext(Node next) {
			this.next = next;
		}
		
		/**
		 * 输出节点内容
		 */
		public void print(){
			System.out.println(this.data + "\t");
			if(this.next != null){
				this.next.print();
			}
		}
		
		/**
		 * 	添加节点内容
		 * @param newNode
		 */
		public void add(Node newNode){ //将节点加入到合适的位置
			if(this.next == null){
				this.next = newNode;
			}else{ //如果不为空,则需要向下继续找next
				this.next.add(newNode);
			}
	 	}
		
		/**
		 * 查找节点
		 * @param data
		 * @return
		 */
		public boolean search(String data){ //内部搜索的方法
			if(this.data.equals(data)){
				return true;
			}else{ //向下继续判断
				if(this.next != null){ //如果不等于null,就继续向下查找下去
					return this.next.search(data);
				}
				return false;
			}
		}
		
		/**
		 * 删除节点
		 * @param data
		 */
		public void deleteNode(Node previous , String name){
			if(name.equals(this.data)){
				previous.next = this.next;
			}else{
				if(this.next != null){
					this.next.deleteNode(this, name);
				}
			}
		}
	};
	
	
	
	private Node root; //链表中必然存在一个根节点
	public void setRoot(Node root){
		this.root = root;
	}
	public Node getRoot(){
		return this.root;
	}
	
	/**
	 * 添加节点内容
	 * @param data
	 */
	public void addNode(String data){ //增加节点
		Node newNode = new Node(data); //定义新的节点
		if(this.root == null){ //判断根节点是否存在,如果不存在就将第一个节点设置成根节点
			this.root = newNode; //将第一个节点设置成根节点
		}else{ //不过如果存在,【不是根节点】,放到最后一个节点之后
			this.root.add(newNode);
		}
	}
	
	/**
	 * 输出全部的节点内容
	 */
	public void printNode(){
		if(this.root != null){ //如果根元素不为空
			this.root.print(); //调用节点类中的输出操作
		}
	}
	
	/**
	 * 查找节点
	 * @param name
	 * @return
	 */
	public boolean contains(String name){
		return this.root.search(name); //调用node类中的查找方法
	}
	
	/**
	 * 删除节点
	 * @param name
	 */
	public void deleteNode(String data){
		if(this.contains(data)){ //判断节点是否存在
			//一定要判断此元素现在是不是与根元素相等
			if(this.root.data.equals(data)){ //内容是根节点
				this.root = this.root.next;  //修改根节点,将第一个节点设置成根节点
			}else{
				this.root.next.deleteNode(root,data);
			}
		}
	}
}
 

猜你喜欢

转载自loveeveryday.iteye.com/blog/1678163
今日推荐