环形链表实现类 package day03 ; /** * @Author yqq * @Date 2022/05/05 11:41 * @Version 1.0 * 模拟环形单链表的实现 */ public class CycleLinkedList { /** * 用于保存单链表中的首节点 */ private Node headNode ; /** * 用
环形链表实现类
package day03;/**
* @Author yqq
* @Date 2022/05/05 11:41
* @Version 1.0
* 模拟环形单链表的实现
*/
public class CycleLinkedList {
/**
* 用于保存单链表中的首节点
*/
private Node headNode;
/**
* 用于保存单链表中的尾结点
*/
private Node lastNode;
/**
* 用于保存单链表中节点的个数
*/
private int size;
public CycleLinkedList() {
}
public CycleLinkedList(int size) {
this.size = size;
}
public int size(){
return this.size;
}
/**
* 在链表尾部添加元素
* @param element
*/
public void add(Object element){
//把需要添加的数据封装成对象
Node node = new Node(element);
//处理单链表为空的情况
if (headNode == null){
//把node节点设置成单链表的首节点
headNode = node;
//把node设置成单链表的尾结点
lastNode = node;
}else {//处理单链表不为空的情况
//让lastNode指向node节点
lastNode.next = node;
//更新lastNode的值
lastNode = node;
}
//设置lastNode的next为headNode
lastNode.next = headNode;
//更新size的值
size ++;
}
/**
* 根据序号获取元素的值
*/
public Object get(int index){
//判断序号是否合法
if (index < 0)
throw new IndexOutOfBoundsException("序号不合法,index:"+ index);
//根据序号获取对应的节点对象
Node node = node(index);
//获取并返回node节点的数据值
return node.data;
}
/**
* 根据序号删除元素
* @param index
*/
public void remove(int index){
//判断序号是否合法
if (index < 0 || index >= size)
throw new IndexOutOfBoundsException("序号不合法,index:"+ index);
//处理删除节点在开头的情况
if (index == 0){
//获得删除节点的后一个节点
Node nextNode = headNode.next;
//设置headNode的next值为null
headNode.next = null;
//设置设置nextNode为单链表的首节点
headNode = nextNode;
//设置lastNode的next为headNode
lastNode.next = headNode;
}
//处理删除节点在结尾的情况
else if (index == size - 1){
//获得删除节点的前一个节点
Node preNode = node(index - 1);
//设置preNode的next为null
preNode.next = null;
//设置preNode为单链表的尾结点
lastNode = preNode;
//将lastNode的next设置为headNode
lastNode.next = headNode;
}
//删除节点在中间的情况
else {
//获得index-1所对应的节点对象
Node preNode = node(index - 1);
//获得index+1所对应的节点对象
Node nexNode = preNode.next.next;
//获得删除节点,并设值为null
preNode.next.next = null;
//设置preNode的next值为nexNode
preNode.next = nexNode;
}
//更新size的值
size --;
//判断size的值是否为0,如果size的值为0,则设置headNode和lastNode为null,此处代码必须在 size--之后
if (size == 0){
headNode = null;
lastNode = null;
}
}
/**
* 根据序号插入元素
* @param index
* @param element
*/
public void add(int index, Object element){
//判断序号是否合法
if (index < 0 || index > size)
throw new IndexOutOfBoundsException("序号不合法,index:" + index);
//把需要添加的数据封装对象
Node node = new Node(element);
//处理插入节点在开头的情况
if (index == 0){
//设置node节点的next为headNode
node.next = headNode;
//设置node为单链表的首节点
headNode = node;
//设置lastNode的next为headNode
lastNode.next = headNode;
}
//处理插入节点在末尾的情况
else if (index == size - 1){
//设置lastNode的next为node
lastNode.next = node;
//设置node为单链表尾结点
lastNode = node;
//设置lastNode的next指向headNode
lastNode.next = headNode;
}
//处理插入节点在中间的情况
else {
//获得index-1所对应的的节点对象
Node preNode = node(index - 1);
//获得index所对应的节点对象
Node curNode = preNode.next;
//设置preNode的next为node
preNode.next = node;
//设置node的next为curNode
node.next = curNode;
}
//更新size的值
size ++;
}
/**
* 根据序号获取对应节点对象
* @param index
* @return
*/
private Node node(int index){
//如果环形链表为空
if (headNode == null)
throw new NullPointerException("环形单链表为空表");
//定义一个临时节点
Node tempNode = headNode;
//定义一个循环,用于获取index对应的节点对象
for (int i = 0; i < index % size; i++) {
//更新tempNode的值
tempNode = tempNode.next;
}
return tempNode;
}
/**
* 节点类
*/
private static class Node{
/**
* 用于保存节点中的数据
*/
private Object data;
/**
* 用于保存指向下一个节点的地址值
*/
private Node next;
/**
* 构造方法
* @param data
*/
public Node(Object data) {
this.data = data;
}
}
}
测试类
package day03;/**
* @Author yqq
* @Date 2022/05/06 12:24
* @Version 1.0
*/
public class Test04 {
public static void main(String[] args) {
CycleLinkedList list = new CycleLinkedList();
list.add("11");
list.add("22");
list.add("33");
// list.add("44");
//根据序号获取元素
//根据序号删除元素
// list.remove(0);
//根据序号位置插入元素
list.add(3,"0");
// System.out.println(list.get(5));
System.out.println();
}
}