一切皆为对像,链表本是可以看成一个对像,链表的结点同样也可以看成一个对像。
自定义异常类:
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;
}
}
分享到:
相关推荐
这是一个单向链表,它具有插入与删除节点的功能。Entry类实现了链表的各节点。
Java SE程序 类实现单向链表Java SE程序 类实现单向链表Java SE程序 类实现单向链表Java SE程序 类实现单向链表Java SE程序 类实现单向链表Java SE程序 类实现单向链表Java SE程序 类实现单向链表Java SE程序 类实现...
Java实现单向链表反转 Java实现单向链表反转是指将单向链表的顺序颠倒,例如原链表为A->B->C->D->E->F,反转后变为F->E->D->C->B->A。这种操作在实际开发中非常有用,例如在数据处理、数据分析等领域。 单向链表...
主要给大家介绍了关于Java实现单向链表基本功能的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
这段源代码提供了一个简单的单向链表实现,包括插入、删除和打印链表的方法。你可以根据实际需求扩展其他功能,如查找节点、反转链表等。在培训班中,这样的代码示例有助于学员理解和掌握单向链表的工作原理及其在...
java语言模拟单向链表,JAVA数据结构
本话题主要探讨两种常用的数据结构——单链表和双向链表在Java中的实现,以及相关的操作,如在头部添加节点、在尾部添加节点、遍历、逆置和删除。 首先,我们来理解单链表和双向链表的基本概念。单链表是一种线性...
本篇将深入探讨由Java实现的单向链表和双向链表。 首先,我们来理解单向链表。单向链表中的每个节点包含两部分:数据域(存储实际数据)和指针域(存储指向下一个节点的引用)。这种结构使得链表只能向前遍历,不能...
04.单向链表以及单向链表的应用.ppt
在Java中,链表主要分为两种类型:单向链表和双向链表。单向链表的每个节点只能指向下一个节点,而双向链表的节点则可以同时指向前后两个节点,提供了更灵活的遍历方式。 1. 单向链表: - 单向链表的节点定义:...
### JAVA单向链表的实现知识点详解 #### 一、链表基础概念 在深入了解Java单向链表的具体实现之前,我们首先需要了解链表的基本概念。链表是一种线性数据结构,它由一系列节点组成,每个节点包含两部分:数据域和...
在Java编程中,单向链表是一种常见的数据结构,它由一系列节点...通过这个例子,你不仅学会了如何在Java中实现单向链表,还了解了如何在实际编程中使用它们。记住,理解并熟练掌握数据结构是提升编程技能的关键步骤。
在"第一、二章"的压缩文件中,很可能包含了实现单向链表和双向链表操作的C、C++、Java或Python等语言的源代码示例。这些示例程序可能涉及了初始化链表、插入新节点、删除指定节点、查找特定元素、打印链表内容等功能...
附件是Java版逆序单向链表的实现,一个.java 文件,编译后即可运行,文件绿色安全,仅供学习交流使用,欢迎大家下载学习交流! 代码首先定义了一个ListNode类来表示链表中的节点,然后在reverseList方法中实现了...
在编程领域,算法是解决问题的关键,而链表作为一种基础数据结构,在实现各种复杂算法时扮演着重要角色。本文将深入探讨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 自己写的 测试通过 有注释