刚开始对数组队列和链表不是很清楚,这两天又上了几节课总算大概了解了点。数组队列和链表各有优点,具体怎么用就是胡哥说的看情况。
链表修改比较方便,但是获取内容时没有数组方便,需要从头节点开始一个个往下指向。
1.链表增加时不需要重新定义,而只需要新建一个节点node,然后让原先的尾节点指向node,再把node赋给尾节点,当然新建之前要先判断一下头节点是否为空。代码实现如下
/** * 添加节点的方法 * * @param node要被添加的节点对象 */ public void add(Node node) { // 判断root是否为null,如果是,则表示此时第一个添加节点 if (root == null) { root = node;// 将新节点给根节点 tail = node;// 将新节点给尾节点 } else {// 将新节点添加到尾节点之后 tail.setNext(node); tail = node; } size++;// 计数器加1 }
2.删除时只要指定删除位置的上一个节点直接指向指定删除位置的下一个节点就欧了,代码实现如下
/** * 移除指定索引位置的数据 * * @param index指定的索引位置 * @return 返回移除的数据 */ public Object remove(int index) { Node node = root;// 循环的节点 Node removeNode;// 要移除的节点 if (index == 0) {// 如果要移除的是第一个节点 root = node.getNext();// 将root的下一个节点设置为root removeNode = node;// 把原来的root赋给要移除的节点 } else {// 如果要移除的是不是第一个节点 // 找到要移除节点的前一个节点对象 for (int i = 0; i < index - 1; i++) { node = node.getNext(); } // 判断要移除的节点是否是最后一个 if (index == size - 1) { // 将node的下一个节点赋给要移除的节点 removeNode = node.getNext(); // 将node的下一个节点引用设置为null node.setNext(null); } else {// 要移除的节点是在链表的中间 // 将node的下一个节点赋给要移除的节点 removeNode = node.getNext(); // 将removeNode下一个节点的引用赋给nextNode Node nextNode = removeNode.getNext(); // 将nextNode赋给node,保持链表不会中断 node.setNext(nextNode); } } size--; // 返回要移除节点的数据域对象 return removeNode.getObj(); }
3.根据指定索引获取相关信息较数组则会麻烦一点。链表不像数组一样有具体的编号,链表取出需要从头节点开始一个一个循环指下去,假如需要获取index位置的数据,先判断一下索引是否越界,一般默认头节点索引为0,则需要从头节点开始循环index次,即for(int i=0;i<index;i++){node = node.getNext();},代码如下
/** * 获取指定索引位置节点的数据 * * @param index指定的索引位置 */ public Object get(int index) { if (index < 0 || index > size) throw new RuntimeException("索引越界!!"); // return null; Node node = root; // 循环获取到指定索引位置的数据 for (int i = 0; i < index; i++) { node = node.getNext(); } // System.out.println(node); // 返回指定索引位置的元素 return node.getObj(); }
4.在指定索引处添加一个节点原理也和删除的类似,即新建一个节点,把要添加的内容赋给它,然后再让它上一个节点指向它并让它指向下一个节点。因此需要先获取指定索引上一个和指定索引处的节点,具体代码实现如下:
/** * 在指定索引下插入节点 * * @param index * @param obj */ public void insertlndexObj(int index, Object obj) { if (index < 0 || index > size) { throw new RuntimeException("索引越界!!"); } else { // 创建一个新的节点 Node newNode = new Node(obj); if (index == 0) {// 如果链表没有节点 root = newNode; } else { // 得到当前的节点 Node node1 = root; Node node2 = root; // 循环获取到指定索引位置的数据 for (int i = 0; i < index-1; i++) { node1 = node1.getNext(); } for (int i = 0; i < index; i++) { node2 = node2.getNext(); } node1.setNext(newNode); newNode.setNext(node2); } } }
5.修改指定索引index处的节点时,只需从头节点0开始,循环index次找到需要修改的节点直接修改即可,即
/** * 修改节点对象 * * @return */ public Object Update(int index, Object obj) { if (index < 0 || index > size) { throw new java.lang.RuntimeException("下标越界:" + index + ",size: " + size); } else { // 得到当前的节点 Node node = root; // 循环获取到指定索引位置的数据 for (int i = 0; i < index; i++) { node = node.getNext(); } node.setObj(obj); return node.getObj(); } }
数组与链表相比,修改就会有所不便。数组的长度是一开始就定义好的,无法修改,所以需要增删时需要重新定义一个符合条件长度的数组,然后再通过代码实现需要的功能。
1.需要在数组中添加一个数据时,先新建一个比原数组长度多1个单位的数组,然后从0开始遍历原数组的长度,将内容对应赋给新数组,再将需要添加的数据赋给最后一个节点,下标即为原来的A数组长度,最后再把新数组的地址赋给原数组,就实现了对原数组的覆盖
// 向队列中加入一个学生对象 public void add(Student st) { // 1.新建一个数组,数组的长度是原数组长度+1 Student[] srcB = new Student[srcA.length + 1]; // 2.将原数组中的数据放入新数组 for (int i = 0; i < srcA.length; i++) { srcB[i] = srcA[i]; } // 3.将要加入的对象放入新数组的最后一位 srcB[srcA.length] = st; // 将srcB数组的地址赋给srcA srcA = srcB; }
2.取得指定位置的对象相比较链表就会方便很多,直接查询指定的下标即可。
/** * 取得队列中指定位置的一个对象 */ public Student get(int index) { // 判断索引是否越界 if (index < 0 || index >= srcA.length) { throw new RuntimeException("索引越界!"); } return srcA[index]; }
3. 在指定索引处插入数据,删除指定索引数据的数据都差不多,也是需要通过一个新数组来实现,或长度增加或减少,只是插入数据时单独多赋一个数据进去,分三个循环赋值,删除数据直接忽视需要删除的数据,从断点处两次循环就可以了。
/** * 在指定索引处插入数据 * * @param index * @param obj */ public void insert(int index, Student obj) { if (index < 0 || index >= srcA.length) { throw new RuntimeException("下标越界"); } else { Student[] srcB = new Student[srcA.length + 1]; for (int i = 0; i < index; i++) { srcB[i] = srcA[i]; } srcB[index] = obj; for (int i = index; i < srcA.length; i++) { srcB[i + 1] = srcA[i]; } // 将srcB数组的地址赋给srcA srcA = srcB; } } /** * 删除指定索引数据 * * @return */ public void delete(int index) { if (index < 0 || index >= srcA.length) { throw new RuntimeException("下标越界"); } else { Student[] srcB = new Student[srcA.length - 1]; for (int i = 0; i < index; i++) { srcB[i] = srcA[i]; } for (int i = index; i < srcA.length - 1; i++) { srcB[i] = srcA[i + 1]; } // 将srcB数组的地址赋给srcA srcA = srcB; } }
4. 根据索引修改数据直接找到索引处更改即可
/** * 根据索引修改数组队列的对象 * * @param index * @param obj */ public void update(int index, Student obj) { srcA[index] = obj; }
相关推荐
电子科技大学820数据结构总结涵盖了这个主题的多个关键知识点,包括数据结构的基本概念、时间复杂度分析、链表、队列、栈以及递归等。 首先,我们关注到时间复杂度的表示,它用于衡量算法执行效率。通常用大O符号...
"java数据结构总结" java数据结构是计算机科学中研究非数值计算的程序设计问题中计算机的操作对象以及它们之间的关系和操作等等的学科。下面是java数据结构的知识点总结: 一、数据结构定义 数据结构是相互之间...
java 数据结构总结的思维导图笔记,个人做的非常全,需要的自行下载
在深入学习编程的道路上,数据结构总结成了不可或缺的部分。本文将对数据结构的核心概念、算法的定义与特征、以及数据结构的分类与特性进行详尽的阐述。 首先,我们要理解算法的真正含义。算法是一个完整的解题方案...
在《数据结构总结》中,我们首先从绪论部分理解数据结构的基本概念。数据是信息的基础,而数据元素是数据的基本组成单元,可能由多个数据项组成。数据对象是具有相同性质的数据元素的集合,例如整数集合或字符串集合...
本文将深入探讨"漫画算法之基础数据结构总结"中的关键概念,包括栈、队列、散列和数组链表,这些都是编程中不可或缺的部分。 首先,我们来看栈(Stack)。栈是一种后进先出(LIFO)的数据结构,它的操作类似于日常...
计算机考研数据结构总结.pdf
以下是对标题“简单的数据结构总结”及描述中提及的知识点的详细说明: 1. **算法**: - 算法是解决问题的具体步骤,它不等同于程序,但程序的编写依赖于算法的设计。 - 算法的基本特征包括可行性、确定性(每...
考研408数据结构总结Markdown
《算法与数据结构总结》是一份详尽的文档,涵盖了计算机科学中至关重要的主题——算法与数据结构。这篇总结深入浅出地阐述了算法与数据结构的基本概念,以及它们在计算机科学中的应用。 首先,算法是解决问题或执行...
数据结构是计算机科学中至关重要的基础概念,它研究如何有效地组织和存储数据,以便于高效地访问和操作。本文将对数据结构的经典算法进行详细解析,帮助理解和掌握这些核心概念。 首先,我们要明确数据和数据元素的...
数据结构总结图(一张大图总结数据结构详细知识框架),从数据结构开始划分,一直划分到详细的知识点,再到详细知识点讲解。
数据结构总结.pptx
在这个详细完整版的数据结构总结中,我们可以看到以下几个核心知识点: 1. **数据结构的定义**:数据结构是一门研究非数值计算的程序设计问题中,操作对象(数据元素)以及它们之间的关系和操作的学科。数据结构是...
数据结构总结.md
【NOI金牌吴确大神算法+数据结构总结】 在计算机科学的世界里,算法和数据结构是构建高效程序的基础。NOI(全国青少年信息学奥林匹克竞赛)金牌得主吴确,以其深厚的理论功底和丰富的实践经验,为我们揭示了算法与...
### 数据结构总结——彩色版来自哈工大 #### 一、概述 本总结文档由哈尔滨工业大学提供,旨在帮助学生深入理解和掌握数据结构的基础知识。文档覆盖了数据结构的关键概念、不同类型的结构(如线性表、树、图等),...
数据结构是计算机科学中的核心概念,它涉及到如何在内存中高效地组织和管理数据,以便进行各种计算和操作。在本篇文章中,我们将深入探讨标题和描述中提及的基础数据结构,包括栈、队列、二叉树以及图,并结合压缩包...