我这里主要是对基本的数据结构进行说明,包括数组,链表,栈,队列,树,图。
1.数组和链表的说明
数组的这个可以说是大家最广泛使用的数据结构了。数组的最主要的特点是可以支持随机存取,也就是说,我们查询一个值时,可以在O(1)时间内完成。如果我们在数组中删除一个元素,一般都是把后面元素向前移动,返回被删除的元素,如果插入一个新元素,我们把元素向后移动,留出一个空位,插入新元素。可见,删除和插入的时间复杂度为O(n)。
数组的特点时,我们在使用时需要先指定空间的大小(其实,我也可以采用一些变相的操作,来达到动态扩展空间的目的)。然而,使用链表,则可以动态的增加新的内存空间以保存新的元素。其实链表就像用一根绳子把一些珠子串起来。要访问链表中的一个元素时,必须顺着链表进行,直到找到我们要访问的元素,时间复杂度为O(n),但是插入元素时,我们可以在O(1)时间内完成,比如直接插入到链表头的位置,再更新头指针位置。删除元素时,我们也可以在O(1)时间内完成,我们只需要修改删除元素前后元素的指针,使他们连接起来就可以了。
因此,如果是对于经常访问元素时,我们采用数组的方式来实现;如果是经常插入和删除元素时,我们采用链表来实现。
深入分析几个操作:
1)链表的反转
链表的反转可以采用递归的方式,当然也可以采用非递归的方式实现了。我这里说一下非递归的方式实现链表反转,非常简单,其实在面试过程中,经常遇到这个问题,我也遇到过好几次。使用3个指针就可以了。
returnNode表示反转链表的头指针,初始值为null
currentNode表示正在处理的节点,我们应该将此节点的指针反转,指向反转链表的头指针。其初始值为原来链表的头指针。
nextNode即将进行反转操作的下一个节点。
public static Node reverse(Node head){
Node returnNode=null,currentNode=head,next=null;
while(currentNode!=null){
//记录将要处理的下一个节点
next=currentNode.next;
//处理当前节点的指针
currentNode.next=returnNode;
//改变反转链表的头指针
returnNode=currentNode;
//继续处理下一个节点
currentNode=next;
}
return returnNode;
}
2)两个有序链表的合并
public static Node merge(Node a,Node b){
//先建立一个哑节点
Node dummy=new Node();
//head指向返回链表的头节点,c是指向返回链表的正在处理的节点;
Node head=dummy,c=head;
while((a!=null)&&(b!=null)){
if(less(a.value,b.value)){
c.next=a;c=a;a=a.next;
}else{
c.next=b;c=b;b=b.next;
}
}
c.next=(a= =null)?b:a;
return head.next;
}
上面的操作就可以把两个有序的链表(我们假定都是升序)合并成一个有序的链表。注意,其实上面的代码也并是总能正确的工作,例如,若两个有序链表是相交的或者是有环的,需要进一步进行细腻的处理。
3)在链表上进行递归操作
例如,我们计算链表的元素的个数:
int count(Node h){
if(h= = null) return 0;
return 1+count(h.next);
}
我们知道,递归操作其实是由系统在为我们维护一个栈,因此,如果链表非常长时,我们堆栈的深度为非常深,这样会导致堆栈的溢出,所以在链表上进行递归操作时,要特别注意这种情况,我们可以改成非递归的实现方式。
分享到:
相关推荐
再来说说队列,它是另一种基本的数据结构,遵循先进先出(FIFO)的原则。在Java中,队列可以通过`java.util.Queue`接口实现,常见的实现类有`LinkedList`和`ArrayDeque`。队列的主要操作包括入队(enqueue,将元素...
本项目聚焦于“串”的基本操作,这是一种常见的线性数据结构,通常用于存储文本信息。在这里,我们将深入探讨串的基本操作,以及如何通过编程实现这些操作。 串是由字符组成的序列,通常在许多编程语言中被表示为...
在这个《数据结构课程设计》项目中,我们专注于二叉树的基本操作,通过两个源文件(file1.cpp 和 file2.cpp)以及一个头文件(head.h)实现了一系列的二叉树操作。以下是这些操作的详细说明: 1. **创建二叉树**:...
1. **数据结构基础**:首先,我们需要理解基本的数据结构类型,如数组、链表、栈、队列等。数组是最基础的数据结构,提供随机访问;链表允许动态插入和删除,但访问效率较低;栈遵循“后进先出”(LIFO)原则,常...
联众HIS1.0版数据结构说明书详细阐述了该医疗信息系统的数据组织方式,为理解和操作该系统提供了基础。HIS(Hospital Information System)是医院信息系统,它整合了医院内的各种信息资源,实现了医疗业务流程的自动...
作者采用了独特的方法将数据结构分成说明和实现两部分,并充分利用了已有的数据结构库(Java集合类API)。本书分为四个部分:第一部分讨论适合大多数应用的集合类API的一个子集,并覆盖基本的算法分析技术、递归和...
本资源提供了数据结构题集的完整答案,涵盖了数据结构的基本概念、抽象数据类型、存储结构、数据类型等方面的知识点。下面是对资源中提到的知识点的详细解释: 1. 数据结构的基本概念 根据题目,数据是对客观事物...
接下来,我将详细说明算法文档和基本数据结构中的一些关键知识点。 算法文档的写作通常遵循以下结构: 1. 引言:这部分一般会解释算法的背景,应用场景以及算法的目的和功能。 2. 算法描述:这是算法文档的核心...
2. **数据结构选择**:说明所选用的数据结构,比如可能选择链表实现队列,二叉树实现搜索结构等,解释选择的理由。 3. **算法设计**:详细描述用于操作数据结构的算法,如排序、查找等,可以包括插入、删除、查找等...
第一部分:数据结构与算法的基本概念 考核内容: 算法、算法正确性、复杂性; 算法的时间与空间复杂性级别; 数据类型、数据结构和表示、实现; 抽象数据类型的说明、高级语言对抽象数据类型的支持 考核要求: 理解...
《Java版数据结构》是一本针对程序员深入理解数据结构的经典读物。数据结构作为计算机科学的基础,对于编写高效、优化的程序至关重要。本书旨在探讨如何在Java编程环境中有效地组织和管理数据,以提升程序的性能和可...
学习数据结构注意的问题:系统掌握基本数据结构的特点及其不同实现;了解并掌握各种数据结构上主要操作的实现及其性能(时间、空间)的分析;掌握各种数据结构的使用特性,在算法设计中能够进行选择;掌握常用的递归...
本书对每一种数据结构都给出了相应的抽象数据类型规范说明和实现方法,使得学生能够掌握每种数据结构的逻辑结构和存储结构,并能够分析和比较不同算法的性能。 该书采用类C语言描述数据结构和算法,考虑到C语言的...
课程内容重点介绍了算法和数据结构的基本概念、理论及其在实际应用中的重要性。王教授的课程不仅深入浅出地讲述了理论知识,而且还注重实践应用,帮助学生掌握如何将复杂问题转化为计算机可处理的形式,并通过合理...
在本课程设计中,我们将深入探讨C语言实现数据结构中的一个重要概念——图的遍历。图是一种非线性数据结构,由顶点和边组成,广泛应用于计算机科学的多个领域,如网络路由、社交网络分析等。本次设计的核心任务是...
在这个资料包中,"数据结构 算法例题 以及常用的排序算法和文档说明"提供了丰富的学习资源,帮助我们深入理解这两个核心概念。 数据结构是组织和存储数据的方式,它决定了数据的访问效率和处理速度。常见的数据结构...
作者采用了独特的方法将数据结构分成说明和实现两部分,并充分利用了已有的数据结构库(Java集合类API)。本书分为四个部分:第一部分讨论适合大多数应用的集合类API的一个子集,并覆盖基本的算法分析技术、递归和...
东南大学提供的数据结构课件是一份宝贵的教育资源,它以《数据结构(C++描述)》(金远平编著,清华大学出版社,2005)作为基础教材,并由陈钢老师负责讲解。在这份课件中,详细介绍了数据结构在软件开发中的重要性...
1. **数组**:数组是最基本的数据结构,它在内存中连续存储相同类型的数据元素。数组的访问速度非常快,但插入和删除操作可能需要移动大量元素。 2. **链表**:链表不需连续存储,每个节点包含数据和指向下一个节点...