2016.06.06
上课内容:链表
前面我们有讲到数组队列,知道它的优点是查询快,元素是整块添加的,而与数组列表相反,链表添加很快,比较方便插入和删除操作,但它查询慢,元素是离散的。
链表由一系列结点组成,结点可以在运动时动态生成。每个结点包括两个部分:一个是存储数据结构的数据域,另一个是存储下一个结点地址的指针。
下面我们来介绍俩种链表。
单链表:由两部分组成:
一个是结点的数据,用data表示。
另一个是结点指向的地址,用next表示。
我们从一个根节点开始,它有一个data,当我们需要再建立一个节点时,把next指向下一个节点的地址,这样就达到了连接的效果。链表的好处就在于当创建一个节点时,就会开辟一段内存空间,删除一个节点时,就会释放一段内存空间。这样大大节省了内存空间。
双向链表:由三部分组成:
一个是该节点的数据,用data表示。
一个存储直接子节点地址,一般称为右链域。 一个存储直接父节点地址,一般称之为左链域。
下面我们举例说明:
public class Manager { public static void main(String[] arg){ //创建一个字符串的链表 MyLinkList<String> list = new MyLinkList<String>(); //添加字符串 list.add("hello"); list.add(" "); list.add("world"); //获取所有的元素并且输出 for(int i=0; i<list.getLength(); i++){ System.out.print(list.get(i)); } } }
public class Node<E> { //保存数据 E data; //下一个节点 Node<E> next; //根据数据新建节点 Node(E e){ data = e; } //无参的构造方法 Node(){ } }
public class MyLinkList<E> implements MyList<E>{ //长度 private int size; //头节点 private Node<E> head; //尾节点 private Node<E> tail; @Override public void add(E e) { //新建一个节点 Node<E> newNode = new Node<E>(e); if(size == 0){//如果是第一个节点 //头节点和尾节点都指向第一个节点 head = newNode; tail = newNode; }else{ //把新节点添加到末尾 tail.next = newNode; //把尾节点修改为新节点 tail = newNode; } //长度+1 size++; } @Override public void delete(int index) { // TODO Auto-generated method stub } @Override public int getLength() { // TODO Auto-generated method stub return size; } @Override public void update(int index, E newE) { // TODO Auto-generated method stub } @Override public E get(int index) {//从头节点开始往后一个个的查询 //新建一个节点,等于头节点 Node<E> node = head; for(int i=0; i<index; i++){ //往后移动一个 node = node.next; } return node.data; } }
public interface MyList<E>{ /** * 添加一个元素 * @param e 需要添加的元素 */ public void add(E e); /** * 删除指定位置的元素 * @param index 需要删除元素的下标 */ public void delete(int index); /** * 获取元素个数 * @return 元素的个数 */ public int getLength(); /** * 修改指定下标的元素 * @param index 需要修改的元素下标 * @param newE 新的元素 */ public void update(int index,E newE); /** * 获取指定下标的元素 * @param index 元素下标 * @return 需要获取的元素 */ public E get(int index); }
public class test { public Node createlink() { Node root = new Node(); String s0 = "a"; Object o = (String) s0; root.data = o; Node next1 = new Node(); String s1 = "b"; Object o1 = (String) s1; next1.data = o1; Node next2 = new Node(); String s2 = "c"; Object o2 = (String) s2; next2.data = o2; Node next3 = new Node(); String s3 = "d"; Object o3 = (String) s3; next3.data = o3; Node next4 = new Node(); String s4 = "e"; Object o4 = (String) s4; next4.data = o4; Node next5 = new Node(); String s5 = "f"; Object o5 = (String) s5; next5.data = o5; root.next = next1; next1.next = next2; next2.next = next3; next3.next = next4; next4.next = next5; return root; } public void println(Node root) { int i = 1; while (null != root) { Object data = root.data; root = root.next; System.out.println("第" + i + "个节点是" + data); i++; } } public Node delet(Node root, int index) { if (index == 1) { root = root.next; return root; } else { Node temp=root; for (int i = 1; i < index - 1; i++) { root = root.next; } root.next = root.next.next; return temp; } } public static void main(String[] args) { test te = new test(); Node root = te.createlink(); te.println(root); root=te.delet(root, 3); te.println(root); } }
相关推荐
邻接表则是以链表形式存储每个顶点的所有邻接顶点,节省空间。这两种表示各有优劣,适用于不同场景。 图的最小生成树算法是图论中的另一大重点,如Prim算法和Kruskal算法。它们用于找到连通图中权值最小的边集,...
链式队列是通过链表来实现的,其特点是队列的元素可以存储在不连续的内存空间中。在链式队列中,同样需要维护两个指针:`head`和`tail`,分别指向队列的头部和尾部结点。链式队列适合于元素数量动态变化的情况,因为...
另一方面,离散存储如链表克服了数组的这些限制,但访问速度相对较慢,因为元素之间通过指针链接而不是物理位置相邻。 动态内存分配和释放是编程中必须掌握的技能,尤其是在C/C++中。动态分配的内存需要程序员手动...
根据提供的文件信息,我们可以深入探讨线性表的两种主要存储结构——顺序存储和链接存储,以及其他的存储方式,如索引存储。 ### 一、顺序存储 #### 1. 存储方法概述 顺序存储是一种最基本的存储方式,它在内存中...
粒子群算法简单、易于实现,并且已经证明在许多问题上具有良好的优化性能,包括连续空间、离散空间和混合空间的优化问题。 在PERT网络优化中,粒子群算法的基本思想是将项目中的每项任务映射为粒子群中的一个粒子,...
如果内存管理不当,可能会导致大量的内存碎片——即许多小块的空闲内存散布在整个内存空间中。这些碎片使得大对象无法找到足够的连续空间来存储,从而降低内存利用率,甚至可能导致程序因无法分配内存而崩溃。 2. *...
文件可能实现了用链表表示的稀疏多项式的加法操作,稀疏多项式是指大部分系数为零的多项式,链表存储可以节省空间。 10. **数制转换_链栈实现.c**: 该程序可能使用链栈来实现不同数制间的转换,如二进制、八进制...
*5.6 C++处理字符串的方法——字符串类与字符串变量 5.6.1 字符串变量的定义和引用 5.6.2 字符串变量的运算 5.6.3 字符串数组 5.6.4 字符串运算举例 习题 第6章 指针 6.1 指针的概念 6.2 变量与指针 6.2.1 定义...
*5.6 C++处理字符串的方法——字符串类与字符串变量 5.6.1 字符串变量的定义和引用 5.6.2 字符串变量的运算 5.6.3 字符串数组 5.6.4 字符串运算举例 习题 第6章 指针 6.1 指针的概念 6.2 变量与指针 6.2.1 定义...
- **链表**:是一种离散存储的数据结构,适合频繁的插入和删除操作。 - **优点**:灵活地添加或删除元素。 - **缺点**:访问速度较慢,因为需要从头开始遍历。 ### 特殊线性结构:栈和队列 栈和队列都是基于线性...
在这个过程中,出现频率较高的字符会被赋予较短的编码,反之则较长,从而在整体上实现对频繁字符的压缩,降低存储空间需求。 首先,我们需要理解数据结构中的基本概念。数据结构是组织和管理数据的方式,包括数组、...
时间复杂度关注算法执行所需时间的量级,而空间复杂度则关注算法执行过程中占用的存储空间的量级。在实际开发过程中,我们会根据不同的场景和需求,选择最适合的算法来优化程序性能。 数据结构是组织和存储数据的...
10. 离散事件模拟 图示窗口分成3部分:中间部分或显示客户流动情况的动画,或显示程序执行过程中事件表和4个队列的数值,上方两个按钮用以切换动画或静态数据,下方则显示客户总人数、客户逗留的累计时间以及调节...
10. 离散事件模拟 图示窗口分成3部分:中间部分或显示客户流动情况的动画,或显示程序执行过程中事件表和4个队列的数值,上方两个按钮用以切换动画或静态数据,下方则显示客户总人数、客户逗留的累计时间以及调节...
龙 翀 -《解决空间规模问题的几种常用的存储结构》 骆 骥 -《数学模型的建立和选择》 施 遥 -《人工智能在围棋程序中的应用》 肖 洲 -《数据结构的在程序设计中的应用》 谢 婧 -《规模化问题的解题策略》 徐 串...
线性表无论是从概念上还是从应用上都是数据结构中的“基石”,其顺序存储结构(数组)与链式存储结构(单链表、双链表、循环链表)的对比,将帮助学生深入理解数据的存储方式对算法效率的影响。在这一部分中,学生需...
本资源" C代码 枚举、列出、排名、取消排名和随机化多元M维空间中的单项式.rar "显然提供了用C语言编写的代码,用于处理数学中的一个重要概念——单项式。单项式是代数学中的基本元素,通常涉及到多项式表达式。下面...
CS(计算机科学)知识体系 ...6. 编写使用以下各种数据结构的程序:数组、记录、字符串、链表、栈、队列和哈希表。 7. 比较并说明动态和静态数据结构实现的代价和收益的不同。 8. 为指定问题的建模选择适当的数据结构。