`
lovnet
  • 浏览: 6813041 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

java算法:链表

 
阅读更多

java算法:链表

链表是一种基本的数据结构,它是多个数据项的集合。链表相对于数组的主要优点在于给我们提供了重新有效地组织数据项的能力,这种便利牺牲快速访问链表中的数据项为代价,因为访问链表就是从开始指针往下查。

在一些编程环境中,链表是基本的数据结构,但是在java中不是。我们构建类,Node:

Java代码 复制代码
  1. classNode{
  2. Objectitem;
  3. Nodenext;
  4. }

要有效地使用链表,内存分配是需要考虑的主要因素。

Java代码 复制代码
  1. Nodex=newNode();

当我们使用链表结构时,对每个对象的所有成员都进行初始化。因为调用构造函数是实例化对象过程的一部分,所以我们可以在每个构造函数中给每个数据域赋值。

Java代码 复制代码
  1. classNode{
  2. Ojbectitem;
  3. Nodenext;
  4. Node(Ojbectv){
  5. item=v;
  6. next=null;
  7. }
  8. }

注意:

要移走节点x后的节点:

t = x.next; x.next = t.next;

在x后插入节点:

t.next = x.next; x.next = t;

插入和删除的简单性是链表存在的理由。要在数组中进行相应的操作就很不方便,因为它们要移动被影响的数据项之后的所有数据项。

链表并不适合有效访问第k项操作的查找。在数组中简单访问a[k]找到第k项。而在链表中,需要遍历k个指针。

当使用 x.next = x.next.next;语句从链表中移走节点时,可能再也不能访问到它了。在java中,这个不需要特别关心,因为java会自动把没有被引用的内存回收。

例一:循环链表例子(约瑟芬问题:N个人围成一圈,每隔M-1个人就去掉一人,然后剩下的人再靠拢,问题是谁是最后剩下的人):

Java代码 复制代码
  1. publicclassJosephus{
  2. publicstaticvoidmain(String[]args){
  3. intN=Integer.parseInt(args[0]);
  4. intM=Integer.parseInt(args[1]);
  5. Nodet=newNode(1);
  6. Nodex=t;
  7. for(inti=2;i<=N;i++){
  8. x=(x.next=newNode(i));
  9. }
  10. x.next=t;
  11. while(x!=x.next){
  12. for(inti=1;i<M;i++){
  13. x=x.next;
  14. }
  15. x.next=x.next.next;
  16. }
  17. System.out.println("survivoris"+x.val);
  18. }
  19. publicstaticclassNode{
  20. intval;
  21. Nodenext;
  22. Node(intv){
  23. val=v;
  24. }
  25. }
  26. }

当N=9,M=5,剩下的是8。

埃拉托色尼筛和约瑟芬问题明显说明了使用数组和链表来分别表示顺序组织的对象集合之间的差异。如果分别使用链表和数组来解决问题,开销会很大。

在java中,对象和对象的引用为链表这个概念提供了直接、便捷的具体实现手段。

分享到:
评论

相关推荐

    Java算法(链表操作实例)

    在编程领域,算法是解决问题的关键,而链表作为一种基础数据结构,在实现各种复杂算法时...在实际开发中,Java的`java.util.LinkedList`类提供了链表操作的便利接口,但自定义链表可以帮助更深入地理解数据结构和算法。

    java 算法:包括数组,哈希表,队列,栈,链表(双端,单向,双向)

    java 算法:包括数组,哈希表,队列,栈,链表(双端,单向,双向),二叉树(普通二叉树,哈夫曼树,二叉查找树,平衡二叉树,二叉线索树),图这些数据结构的实现以及多种排序算法和其他一些算法的实现(递归,二...

    MLDN魔乐JAVA_13链表.MLDN魔乐JAVA_13链表.rar

    - 双链表:每个节点有两个指针,分别指向前一个节点和后一个节点,方便双向遍历。 - 循环链表:最后一个节点的指针不指向null,而是指向链表的第一个节点,形成一个循环。 - 带头节点的链表:链表的第一个节点是头...

    题目整理(链表).pdf

    链表的知识点包括链表的基本概念、链表的类型、链表的操作、链表的应用、链表的优缺点、链表的实现、链表的算法、链表的题目、链表的实际应用、链表的高级应用、链表的优化、链表的安全、链表的发展、链表的研究、...

    java算法全卷(包括基本算法和图算法)

    Java算法全卷涵盖了基本算法和图算法,是学习和提升编程技能的重要资源。这份资料主要针对使用Java语言进行算法实现的开发者,适用于那些对ANT、EJB、J2EE、JAVA和SPRING等技术栈有了解或兴趣的人群。下面我们将深入...

    Java算法实例-双向链表操作

    本实例聚焦于Java中的一个重要数据结构——双向链表,它在很多场景下都有着广泛的应用。双向链表与单链表相比,其独特之处在于每个节点不仅包含指向下一个节点的指针,还包含指向前一个节点的指针,这使得在链表中的...

    java 数据结构 链表

    1. 单向链表: - 单向链表的节点定义:通常会有一个类表示链表节点,例如`Node`,包含一个数据字段和一个指向下一个节点的引用字段。 - 插入操作:在链表的头部或尾部插入新节点相对简单,只需改变相应节点的引用...

    插入,选择排序的链表实现及快速,希尔,冒泡排序算法实现合集

    这里我们主要探讨的是五种不同的排序算法:插入排序、选择排序、快速排序、希尔排序以及冒泡排序,它们都有对应的链表实现。让我们逐一深入理解这些算法。 1. 插入排序(Insertion Sort) 插入排序是一种简单直观...

    有序链表合并算法动态演示系统的毕业设计文档及系统 JAVA

    1. 链表:链表是一种线性数据结构,其中元素并不在内存中连续存储。每个元素(节点)包含数据和指向下一个节点的引用。有序链表是指链表中的元素按照某种顺序排列。 2. 合并算法:有序链表的合并通常通过比较每个...

    Java算法篇-链表去重与合并.pptx.pptx

    在Java算法领域,链表是一种重要的数据结构,它在处理动态数据集合时具有较高的灵活性。本文将探讨如何在Java中实现链表的去重与合并,特别关注有序链表的操作。 首先,我们来理解链表的基本概念。链表不同于数组,...

    java算法大全,有近100多种常见算法的源代码,是学习JAVA算法的难得资料

    Java算法大全是一个珍贵的学习资源,包含了近100种常见的算法实现,对于任何希望深入理解计算机科学基础,尤其是想要提升Java编程技能的开发者来说,都是不可或缺的宝藏。这份资料不仅提供了理论知识,还通过源代码...

    java算法书籍(英文版)

    《Java算法书籍(英文版)》是一套专为Java开发者设计的算法学习资源,涵盖了数据结构与算法分析以及全面的Java算法知识。这套书籍旨在帮助读者深入理解算法的基础概念,提高编程技能,以及解决实际问题的能力。以下...

    Java算法的教程、习题和解析.docx

    关于Java算法的教程、习题和解析,以下是一个综合的概述: 一、Java算法教程 Java算法教程通常涵盖基础算法思想、数据结构以及具体算法实现等方面。以下是一些学习Java算法的重要资源和步骤: 基础学习: 数据类型...

    数据结构与算法复习(Java):排序、字符串、数组、链表、二分查找、二叉树.zip

    算法分类:排序算法(如冒泡排序、快速排序、归并排序),查找算法(如顺序查找、二分查找、哈希查找),图论算法(如Dijkstra最短路径算法、Floyd-Warshall算法、Prim最小生成树算法),动态规划,贪心算法,回溯法...

    算法:给定一个链表,判断链表中是否存在环

    针对题目要求,我们可以用Python、Java和C语言实现快慢指针算法来检测链表中是否存在环。 ##### 1. Python 实现 ```python class ListNode: def __init__(self, val=0, next=None): self.val = val self.next =...

    Java编程语言中的数据结构与算法:深入理解与实践指南.zip

    - 链表:在链表中,每个元素(节点)包含数据和指向下一个节点的引用,不同于数组,它不需连续内存空间。 - 栈:后进先出(LIFO)的数据结构,常用于函数调用、表达式求值等。 - 队列:先进先出(FIFO)的数据...

Global site tag (gtag.js) - Google Analytics