`
out_println
  • 浏览: 14424 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

java实现单向链表

    博客分类:
  • java
阅读更多
一切皆为对像,链表本是可以看成一个对像,链表的结点同样也可以看成一个对像。

自定义异常类:
public class MyException extends Exception {
	
	public MyException(){};
	
	public MyException(String msg){
		super(msg);
	}

}


链表结点对像:
public class Node {

	public Node next=null;
	public Object value=null;
	
	Node(Object value){
		this.value=value;
	}	
}


链表对像:
public class SinglyLinked {
	
	private Node head=null;
	
	SinglyLinked(){
		
	}
	/**
	 * 获取链表头元素
	 * @return 链表头结点
	 * @throws MyException 
	 */
	public Node getHead() throws MyException{
		if(head==null){
			throw new MyException("链表为空");
		}
		return head;
	}
	/**
	 * 获取该结点下的下一个结点
	 * @param node
	 * @return 
	 */
	public Node getNext(Node node){
		return node.next;
	}
	/**
	 * 判断该结点是否还有下一个结点
	 * @param node
	 * @return
	 */
	public boolean hasNext(Node node){
		
		if(node.next==null){
			return false;
		}
		return true;
	}
	/**
	 * 获得链表的最后一个元素
	 * @return
	 * @throws MyException 
	 */
	public Node getLast() throws MyException{
		
		Node curNode=null;
		Node next=null;
		
		if(head==null){
			throw new MyException("链表为空");
		}else{
			curNode=head;
			while(hasNext(curNode)){
				next=curNode.next;
				curNode=next;
			}
		}
		return curNode;
	}
	/**
	 * 根据索引获得元素
	 * @param index
	 * @return
	 */
	public Node getNode(int index)throws MyException{
		
		Node node=null;
		Node curNode=null;
		Node next=null;
		
		if(head==null){
			throw new MyException("链表为空");
		}else{
			curNode=head;
			for(int i=0;i<index;i++){
				if(curNode==null){
					throw new MyException("你要查找的元素索引超过了链表的长度");
				}
				node=curNode;
				if(hasNext(curNode)){
					next=curNode.next;
					curNode=next;
				}else{
					curNode=null;
				}
			}
		}
		return node;
	}
	/**
	 * 在链表头添加结点
	 * @param node
	 */
	public void addFirst(Node node){
		if(head==null){
			head=node;
		}else{
			Node next=head;
			node.next=next;
			head=node;
		}
	}
	/**
	 * 在链表尾部添加元素
	 * @param node
	 * @throws MyException 
	 */
	public void addLast(Node node) throws MyException{
		
		if(head==null){
			head=node;
		}else{
			Node last=this.getLast();
			last.next=node;
		}
	}
	/**
	 * 在链表中间插入元素
	 * @param index 要插入的结点
	 * @param node
	 */
	public void insertNode(int index,Node node)throws MyException{
		
		Node prevNode=null;
		
		try{
			prevNode=getNode(index-1);
		}catch(MyException rex){
			rex.printStackTrace();
			throw new MyException("插入结点的索引大于链表长度");
		}

		if(hasNext(prevNode)){
			Node next=prevNode.next;
			prevNode.next=node;
			node.next=next;
		}else{
			prevNode.next=node;
		}

	}
	/**
	 * 删除链表的第一个元素
	 * @return
	 */
	public Node deleteFirst(){
		Node first=null;
		Node node=head.next;
		first=head;
		head=node;
		return first;
	}
	/**
	 * 删除链表的最后一个元素
	 * @return
	 */
	public Node deleteLast(){
		
		Node last=null;
		Node curNode=head;
		Node next=null;
		boolean flag=true;
		
		if(!hasNext(head)){
			head=null;
		}else{
			while(flag){
				next=curNode.next;
				if(hasNext(next)){
					curNode=next;
				}else{
					curNode.next=null;
					last=next;
					flag=false;
				}
			}
		}
		return last;
	}
	/**
	 * 按照索引删除元素
	 * @param index
	 * @return
	 */
	public Node deleteNode(int index)throws MyException{
		Node prevNode=null;
		try{
			prevNode=getNode(index-1);
		}catch(MyException mex){
			mex.printStackTrace();
			throw new MyException("你要删除的结点索引大于链表的长度");
		}
		Node node=null;

		if(hasNext(prevNode)){
			node=prevNode.next;
			if(hasNext(node)){
				Node next=node.next;
				prevNode.next=next;
			}else{
				prevNode.next=null;
			}
		}else{
			throw new MyException("你要删除的结点索引大于链表的长度");
		}

		return node;
	}	

}
分享到:
评论
1 楼 finallygo 2010-07-02  
这个好像不支持环吧?

相关推荐

    Java 单向链表 插入与删除节点

    这是一个单向链表,它具有插入与删除节点的功能。Entry类实现了链表的各节点。

    Java SE程序 类实现单向链表

    Java SE程序 类实现单向链表Java SE程序 类实现单向链表Java SE程序 类实现单向链表Java SE程序 类实现单向链表Java SE程序 类实现单向链表Java SE程序 类实现单向链表Java SE程序 类实现单向链表Java SE程序 类实现...

    Java实现单向链表反转

    Java实现单向链表反转 Java实现单向链表反转是指将单向链表的顺序颠倒,例如原链表为A-&gt;B-&gt;C-&gt;D-&gt;E-&gt;F,反转后变为F-&gt;E-&gt;D-&gt;C-&gt;B-&gt;A。这种操作在实际开发中非常有用,例如在数据处理、数据分析等领域。 单向链表...

    Java实现单向链表的基本功能详解

    主要给大家介绍了关于Java实现单向链表基本功能的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。

    单向链表源代码

    这段源代码提供了一个简单的单向链表实现,包括插入、删除和打印链表的方法。你可以根据实际需求扩展其他功能,如查找节点、反转链表等。在培训班中,这样的代码示例有助于学员理解和掌握单向链表的工作原理及其在...

    java语言模拟单向链表

    java语言模拟单向链表,JAVA数据结构

    java 单链表和双向链表的实现

    本话题主要探讨两种常用的数据结构——单链表和双向链表在Java中的实现,以及相关的操作,如在头部添加节点、在尾部添加节点、遍历、逆置和删除。 首先,我们来理解单链表和双向链表的基本概念。单链表是一种线性...

    java实现的单向链表和双向链表

    本篇将深入探讨由Java实现的单向链表和双向链表。 首先,我们来理解单向链表。单向链表中的每个节点包含两部分:数据域(存储实际数据)和指针域(存储指向下一个节点的引用)。这种结构使得链表只能向前遍历,不能...

    04.单向链表以及单向链表的应用.ppt

    04.单向链表以及单向链表的应用.ppt

    java 数据结构 链表

    在Java中,链表主要分为两种类型:单向链表和双向链表。单向链表的每个节点只能指向下一个节点,而双向链表的节点则可以同时指向前后两个节点,提供了更灵活的遍历方式。 1. 单向链表: - 单向链表的节点定义:...

    JAVA单向链表的实现.pdf

    ### JAVA单向链表的实现知识点详解 #### 一、链表基础概念 在深入了解Java单向链表的具体实现之前,我们首先需要了解链表的基本概念。链表是一种线性数据结构,它由一系列节点组成,每个节点包含两部分:数据域和...

    java单向链表代码实现

    在Java编程中,单向链表是一种常见的数据结构,它由一系列节点...通过这个例子,你不仅学会了如何在Java中实现单向链表,还了解了如何在实际编程中使用它们。记住,理解并熟练掌握数据结构是提升编程技能的关键步骤。

    数据结构 单向链表 双向链表 源程序

    在"第一、二章"的压缩文件中,很可能包含了实现单向链表和双向链表操作的C、C++、Java或Python等语言的源代码示例。这些示例程序可能涉及了初始化链表、插入新节点、删除指定节点、查找特定元素、打印链表内容等功能...

    Java版逆序单向链表的实现

    附件是Java版逆序单向链表的实现,一个.java 文件,编译后即可运行,文件绿色安全,仅供学习交流使用,欢迎大家下载学习交流! 代码首先定义了一个ListNode类来表示链表中的节点,然后在reverseList方法中实现了...

    Java算法(链表操作实例)

    在编程领域,算法是解决问题的关键,而链表作为一种基础数据结构,在实现各种复杂算法时扮演着重要角色。本文将深入探讨Java中链表的操作实例,旨在帮助开发者更好地理解和运用链表来解决实际问题。 首先,我们需要...

    java链表实现约瑟夫问题

    约瑟夫问题,通过类实现的链表,并加以改进,做成双向链表

    java 单,双向链表自己做的

    以下是一个简单的单向链表实现: ```java public class Node { int data; Node next; public Node(int data) { this.data = data; this.next = null; } } public class LinkedList { Node head; public ...

    java编写的循环链表来实现约瑟夫环

    循环链表 实现约瑟夫环 java 自己写的 测试通过 有注释

Global site tag (gtag.js) - Google Analytics