线性表模拟环形单链表实现(add/remove)操作

网友投稿 529 2022-11-05

线性表模拟环形单链表实现(add/remove)操作

线性表模拟环形单链表实现(add/remove)操作

环形链表实现类

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(); }}

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:SmallVideo + Cutomization / 小视频 + 自定义录制
下一篇:冒泡排序算法的优化实现
相关文章

 发表评论

暂时没有评论,来抢沙发吧~