zoukankan      html  css  js  c++  java
  • Singly Link List(单链表的实现java)

    package com.datastructure.singlylinklist;
    /**
     * 实现一个单链表
     * 实现功能:
     * 增加一个节点(头插法,尾插法)
     * 删除一个节点(删除第一个节点,删除最后一个节点,删除任何一个节点)
     * 查找(查找到一个list中的某个元素)
     * @author Xinyuyu
     *
     */
    public class SinglyLinkList <T> {
    	/*
    	 * 实现一个节点的数据结构
    	 * 数据域
    	 * 指针域
    	 */
    	// header指向list的头
    	// tail指向list的尾
    	private IntSLLNode header;
    	private IntSLLNode tail;
    	class IntSLLNode{
    		public Object data;
    		public IntSLLNode next;
    		// 
    		public IntSLLNode(Object data){
    			this(data, null);
    		}
    
    		public IntSLLNode(Object data, IntSLLNode next){
    			this.data = data;
    			this.next = next;
    		}
    	}
    	
    	public SinglyLinkList(){
    		header = tail = null;
    	}
    
    	// 头插法增加一个节点
    	public void addToHeader(Object o){
    		// 链表不为空的情况
    		// 链表为空的情况
    		header = new IntSLLNode(o, header);
    		if(tail == null)
    			tail = header;
    	}
    	// 尾插法增加一个节点
    	public void addToTail(Object o){
    		// 链表不为空的情况
    		// 链表为空的情况
    		IntSLLNode newNode = new IntSLLNode(o);
    		if(!isEmpty()){
    			tail.next = newNode;
    			tail = newNode;
    		}else
    			tail = header = newNode;
    	}
    	// 删除第一个节点
    	public Object deleteFromHeader() throws Exception{
    		// 链表不为空切大于一个节点
    		// 链表仅有一个节点
    		// 链表为空
    		IntSLLNode node = header;
    		if(!isEmpty()){
    			header = header.next;
    		}else if(!isEmpty() && header == tail){
    			tail = header = null;
    		}else{
    			// 链表为空抛出异常
    			throw new Exception("SSL is empty");
    		}
    		
    		return node.data;
    	}
    	// 删除最后一个节点
    	public Object delteFromTail() throws Exception{
    		// 链表不是空且大于一个节点的时候
    		// 链表仅有一个节点的时候
    		// 链表是空的情况
    		IntSLLNode node = tail;
    		if(!isEmpty() && header != tail){
    			// 一个临时指针,指向头节点,遍历到倒数第二个节点出,将尾指针指向倒数第二个节点
    			IntSLLNode temp = header;
    			for(; temp.next != tail;){
    				temp = temp.next;
    			}
    			tail = temp;
    			temp.next = null;
    		}else if(!isEmpty() && header == tail){
    			tail = header  = null;
    		}else{
    			// 当列表为空的时候抛出异常
    			throw new Exception("SSL is empty");
    		}
    		return node.data;
    	}
    	// 删除链表中的某个节点
    	public Object delete(Object o) throws Exception{
    		// 链表不为空且包含大于一个节点
    		// 链表仅包含一个节点
    		// 链表为空的情况
    		
    		// 删除的为第一个节点
    		if(o.equals(header.data)){
    			return deleteFromHeader();
    			// 删除的为最后一个节点
    		}else if(o.equals(tail.data)){
    			return delteFromTail();
    		}else{
    			IntSLLNode temp = header;
    			if(!isEmpty() && header != tail){
    				for(; !temp.next.data.equals(o);){
    					 temp = temp.next;
    				}
    				if(temp != null){
    					temp.next = temp.next.next;
    					temp = temp.next;
    				}
    			}else if(!isEmpty() && header == tail){
    				if(header.equals(o)){
    					temp = header;
    					header = tail = null;
    				}
    			}else{
    				throw new Exception("SSL is empty");
    			}
    			return temp.data;
    		}
    		// 如果查找到就返回一个节点信息
    		// 查找不到
    	}
    	// 删除节点的另外一个写法(需要两个指针)
    	public Object deletePro(Object o) throws Exception{
    		// 链表不为空且大于一个节点
    		// 链表仅包含一个节点
    		// 链表为空
    		IntSLLNode node = null;
    		if(header.data.equals(o)){
    			return deleteFromHeader();
    		}
    		if(!isEmpty() && header != tail){
    			IntSLLNode pre = header, las = header.next;
    			for(; las != null && !las.data.equals(o); ){
    				pre = pre.next; 
    				las = las.next;
    			}
    			if(las != null)
    				pre.next = las.next;
    			else
    				return delteFromTail();
    			node = las;
    		}else if(!isEmpty() && header == tail){
    			if(header.equals(o));
    				tail = header = null;
    		}else{
    			throw new Exception("SSL is empty");
    		}
    		return node.data;
    	}
    	// 查找链表中的某个节点
    	public Object find(Object o) throws Exception{
    		// 链表为空
    		// 链表不为空
    		IntSLLNode temp = null;
    		if(!isEmpty()){
    			temp = header;
    			for(; temp != null && !temp.data.equals(o); ){
    				temp = temp.next;
    			}
    			if(temp == null)
    				return null;
    			else 
    				return temp.data;
    		}else{
    			// 当链表为空的时候也就是不会查找到需要的节点
    			throw new Exception("The object is not exist in the SLL");
    		}
    	}
    	
    	// 判断链表是否为空
    	public boolean isEmpty(){
    		return header == null;
    	}
    	
    	// 打印出链表
    	public void printSinglyLinkList(String name){
    		System.out.print(name + " : ");
    		for(IntSLLNode tempNode = header; tempNode != null; tempNode = tempNode.next){
    			System.out.print(tempNode.data.toString() + "->");
    		}
    	}
    	// 清空列表
    	public void emptySLL(){
    		header = tail = null;
    	}
    }
    
    package SinglyLinkList;
    
    public class Persion {
    	private String name;
    	private int age;
    	
    	public Persion(String name, int age) {
    		this.name = name;
    		this.age = age;
    	}
    	public String getName() {
    		return name;
    	}
    	public void setName(String name) {
    		this.name = name;
    	}
    	public int getAge() {
    		return age;
    	}
    	public void setAge(int age) {
    		this.age = age;
    	}
    	
    	public String toString(){
    		return "[" + this.name + " age is " + this.age + "]";
    	}
    	// 需要重写equal方法来完成删除和查找
    	@Override
    	public boolean equals(Object o) {
    		if(this.name.equals(((Persion) o).getName()) && this.age == ((Persion) o).getAge())
    			return true;
    		else
    			return false;
    	}
    }
    
    package SinglyLinkList;
    
    import com.datastructure.singlylinklist.SinglyLinkList;
    
    public class TestOfSinglyList {
    	public static void main(String[] args) {
    		SinglyLinkList<Persion> singlyLinkList = new SinglyLinkList<Persion>();
    		Persion p1 = new Persion("张三", 34);
    		Persion p2 = new Persion("李四", 24);
    		Persion p3 = new Persion("王五", 44);
    		Persion p4 = new Persion("李以", 44);
    		Persion p5 = new Persion("王七", 44);
    		
    		// 完成头插法
    		singlyLinkList.addToHeader(p1);
    		singlyLinkList.addToHeader(p2);
    		singlyLinkList.addToHeader(p3);
    		singlyLinkList.addToHeader(p4);
    		singlyLinkList.addToHeader(p5);
    		
    		singlyLinkList.printSinglyLinkList("完成头插法");
    		System.out.println();
    //		System.out.println();
    //		// 清空链表
    //		singlyLinkList.emptySLL();
    //		// 完成尾插法
    //		singlyLinkList.addToTail(p1);
    //		singlyLinkList.addToTail(p2);
    //		singlyLinkList.addToTail(p3);
    //		singlyLinkList.printSinglyLinkList("完成头插法");
    //		System.out.println();
    //		// 完成删除尾节点
    //		try {
    //			Persion p = (Persion)singlyLinkList.delteFromTail();
    //			singlyLinkList.printSinglyLinkList("删除了最后一个节点");
    //			System.out.println();
    //			System.out.println("被删除的尾节点是 :" + p.getName() + " age is " + p.getAge());
    //		} catch (Exception e) {
    //			e.printStackTrace();
    //		} 
    //		// 完成删除头节点
    //		try {
    //			Persion p = (Persion)singlyLinkList.deleteFromHeader();
    //			singlyLinkList.printSinglyLinkList("删除了第一个节点");
    //			System.out.println();
    //			System.out.println("被删除的头节点是 :" + p.getName() + " age is " + p.getAge());
    //		} catch (Exception e) {
    //			e.printStackTrace();
    //		} 
    		// 删除任意一个节点
    		//Persion p = new Persion("张三", 34);
    		try {
    			singlyLinkList.deletePro(p5);
    			singlyLinkList.deletePro(p4);
    			singlyLinkList.deletePro(p3);
    			singlyLinkList.deletePro(p2);
    			singlyLinkList.deletePro(p1);
    			
    			
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    		singlyLinkList.printSinglyLinkList("任意删除一个节点");
    		System.out.println();
    		try {
    			System.out.println(singlyLinkList.find(p1));
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    	}
    }
    
  • 相关阅读:
    【5】TensorFlow光速入门-图片分类完整代码
    【4】TensorFlow光速入门-保存模型及加载模型并使用
    科研数据库结构
    高并发请求的缓存设计策略
    iOS-KVC的原理
    iOS-KVO的原理
    Kafka too many open files问题解决
    VLOOKUP函数-Excel
    arcgis sql 字符串替换
    ArcGIS矢量转栅格再发布切片服务,还是直接发布切片服务?有何区别?
  • 原文地址:https://www.cnblogs.com/xinyuyu/p/3757013.html
Copyright © 2011-2022 走看看