一切皆为对像,链表本是可以看成一个对像,链表的结点同样也可以看成一个对像。
自定义异常类:
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实现单向链表反转,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
java语言模拟单向链表,JAVA数据结构
java单向链表代码实现
04.单向链表以及单向链表的应用.ppt
操作包括: 1. 在头部添加结点 2. 在尾部添加结点 3. 遍历 4. 逆置 5. 删除
一个java实例,用来描述java算法中链表的使用。
附件是Java版逆序单向链表的实现,一个.java 文件,编译后即可运行,文件绿色安全,仅供学习交流使用,欢迎大家下载学习交流! 代码首先定义了一个ListNode类来表示链表中的节点,然后在reverseList方法中实现了...
约瑟夫问题,通过类实现的链表,并加以改进,做成双向链表
培训班老师自己写的单向链表,代码非常全,也很好理解,可执行。
循环链表 实现约瑟夫环 java 自己写的 测试通过 有注释
里面有注释,很详细。 对于数据结构基础不是很好地朋友来说,有很大的帮助。
java单向链表的实现实例。需要的朋友可以过来参考下,希望对大家有所帮助
类似约瑟夫环问题。有一群人组成一个圈。从头开始按照顺时针方向从1开始依次报数。报到到9的人就离开圈子。其左手边的人接着从1开始报数。依此进行,直到剩最后一个人为止。
附件是逆序输出单向链表_Java 版本源码,代码首先定义了一个Node类来表示链表的节点,然后定义了一个LinkedList类来表示单链表,并提供了添加节点、打印链表和逆序链表的方法。最后,在Main类中创建了一个链表实例,...
附件是.java 文件,实现了单链表的逆序算法,文件绿色安全,仅供学习交流使用,欢迎大家下载学习交流! 首先定义了一个ListNode类来表示链表中的节点,然后在reverseList方法中实现了链表的逆序。reverseList方法...