链表有一系列的结点组成,其中单向链表每个结点包括两个部分,一个是存储数据元素的数据域,和指向下一个结点的指针域,而双向链表包含了存储直接子结点地址的右链域,和直接存储父节点地址的左链域,以及存储数据的数据域。下面分别用代码实现单链表与双向链表。
/* * 单向链表结点类 * @author miaofei */ public class singleLink { private Object obj;//节点内的数据对象 private singleLink next;//对下一个节点的引用 //在创建节点对象的时候就传入节点中的数据对象 public singleLink(Object obj) { super(); this.obj = obj; } public Object getObj() { return obj; } public void setObj(Object obj) { this.obj = obj; } public singleLink getNext() { return next; } public void setNext(singleLink next) { this.next = next; } }
用快捷方式添加的构造方法,不知为什么会有super();求教大神!!
单向链表类
/**单向链表类 ** @author miaofei */ public class LinkedNode { public static void main(String[] args) { LinkedNode ln = new LinkedNode(); //创建链表 singleLink root = ln.createLink(); //遍历 ln.printLinklist(ln.root); } //创建链表 public singleLink createLink(){ String s = "根节点"; root = new singleLink(s); singleLink n1 = new singleLink("first"); singleLink n2 = new singleLink("second"); singleLink n3 = new singleLink("third"); singleLink n4 = new singleLink("forth"); root.setNext(n1); n1.setNext(n2); n2.setNext(n3); n3.setNext(n4); return root; } //遍历链表 public void printLinklist(singleLink root){ if(null!=root){ Object data = root.getObj(); System.out.println(data); singleLink temp = root.getNext(); printLinklist(temp); } } }
下面是双向链表,实现了添加,删除的各两种方法,还有从小到大的排序
package NodeLink; public class NodeLinkedList implements NodeLinkedListInterface { private int size = 0;// 节点总数 private Node root = null;// 根节点 private Node last = null;// 尾节点 //根据节点来给链表添加新的节点 public void add(Node node) { // 判断root是否为null if (null == root) { // 让根节点和尾节点都指向新添加的节点 root = node; last = node; } else { // 向末尾添加节点 last.setNext(node); // 将设为上一个节点 node.setPrevious(last); // 将新的节点作为尾节点 last = node; } size++; } /* (non-Javadoc) * @see cn.netjava.lesson13.NodeLinkedListInterface#add(cn.netjava.lesson13.Node, int) */ @Override //给定节点与插入位置来添加节点 public void add(Node node, int index) { if(size<index ||index<0){ throw new RuntimeException("下标越界:"+index+",size"+size); }else{ Node nodenow = get(index); if(index==0){ root = node; }else{ Node fNode = nodenow.getPrevious(); //设置新的引用关系 fNode.setNext(node); node.setPrevious(fNode); // node.setNext(nodenow); // nodenow.setPrevious(node); } //设置新的引用关系 node.setNext(nodenow); nodenow.setPrevious(node); } size++; } /* (non-Javadoc) * @see cn.netjava.lesson13.NodeLinkedListInterface#remove(cn.netjava.lesson13.Node) */ @Override //删除指定的节点 public void remove(Node node){ int I =0; for(int i=0;i<size;i++){ Node nodenow = get(i); if(nodenow==node){ I = i; } } //得到当前索引位置的节点 Node nodenow = get(I); //得到父节点 Node Fnode = nodenow.getPrevious(); //得到子节点 Node Cnode = nodenow.getNext(); if(Fnode==null){ root=Cnode; }else if(Cnode==null){ Fnode.setNext(null); }else{ Fnode.setNext(Cnode); Cnode.setPrevious(Fnode); } size--; } /* (non-Javadoc) * @see cn.netjava.lesson13.NodeLinkedListInterface#remove(int) */ @Override //根据指定索引位删除节点 public void remove(int index){ if(size<index ||index<0){ throw new RuntimeException("下标越界:"+index+",size"+size); }else{ //得到当前索引位置的节点 Node nodenow = get(index); //得到父节点 Node Fnode = nodenow.getPrevious(); //得到子节点 Node Cnode = nodenow.getNext(); if(Fnode==null){ root=Cnode; }else if(Cnode==null){ Fnode.setNext(null); }else{ Fnode.setNext(Cnode); Cnode.setPrevious(Fnode); } } size--; } /* (non-Javadoc) * @see cn.netjava.lesson13.NodeLinkedListInterface#get(int) */ @Override //得到节点索引位的方法 public Node get(int index) { // 超出索引,返回null if (index >= size || index < 0) { return null; } //让node为根节点 Node node = root; //遍历至索引位置 for (int i = 0; i < index; i++) { //获取node节点的下一个节点 node = node.getNext(); } return node; } /* (non-Javadoc) * @see cn.netjava.lesson13.NodeLinkedListInterface#size() */ @Override //得到链表中结点个数的方法 public int size() { return size; } }
程序主体如下
package NodeLink; import java.util.Random; public class Meneger { /** * @param args */ public static void main(String[] args) { // 用第一种添加方法初始化链表内容 NodeLinkedListInterface nll = new NodeLinkedList(); Random rand = new Random(); for (int i = 0; i < 10; i++) { Node node = new Node(rand.nextInt(100)); nll.add(node); } for (int i = 0; i < 10; i++) { Node node = nll.get(i); System.out.print(node.getData()+" "); } System.out.println("\n"); // 用第二种添加方法插入一个数字 int index = rand.nextInt(10); Node node = new Node(rand.nextInt(100)); nll.add(node, index); for (int i = 0; i < 11; i++) { if (i == index) { Node node1 = nll.get(i); System.out.print("new " + node1.getData()+" "); } else { Node node1 = nll.get(i); System.out.print(node1.getData()+" "); } } System.out.println("\n"); //移除 int index1 = rand.nextInt(10); int indexx = index1+1; System.out.println("移除的是第"+indexx+"个节点"); nll.remove(index1); for(int i=0;i<nll.size();i++){ Node node2 = nll.get(i); System.out.print(node2.getData()+" "); } System.out.println("\n"); // 第二种移除 int index2 = rand.nextInt(10); System.out.println("移除的是第" + (index2 + 1) + "个节点"); nll.remove(nll.get(index2)); for (int i = 0; i < nll.size(); i++) { Node node3 = nll.get(i); System.out.print(node3.getData() + " "); } for (int i = 1; i < nll.size(); i++) { for (int j = i; j > 0; j--) { Node node1 = nll.get(j); Node node2 = nll.get(j - 1); if (nll.get(j).getData() < nll.get(j - 1).getData()) { int temp = nll.get(j).getData(); nll.get(j).setData(nll.get(j - 1).getData()); nll.get(j - 1).setData(temp); } } } System.out.println(""); System.out.println("从小到大排序后的结果为:"); for (int k = 0; k < nll.size(); k++) { Node nodex = nll.get(k); System.out.print(nodex.getData()+" "); } } }
结点类与接口比较简单略去不写。
关于链表,有几个感受,我又一次要把它跟C语言对比。。。C的链表跟java的链表大同小异,这种通过绑定地址来实现的节点之间的连接操作,突破了数组中数据必须相同类型,并且必须连续的限制,增加了使用的灵活性,在这次的练习中,加深了对递归的理解~递归超级有用啊,极大的缩短了代码量,感觉数据结构好有意思。。。估计我说这句话会被拍死。。。好啦,这就是这一部分的总结,精华全在代码
相关推荐
【标题】: 趣味数据结构与算法 【知识点】: 1. 算法与数据结构的重要性 数据结构和算法是计算机科学的基础,对于提高程序的效率、处理大规模数据以及解决复杂问题至关重要。在这个部分,提到了“通俗的”常用数据...
这门课程的经典性在于其对于理解算法和编程的基础性作用,无论是初学者还是经验丰富的程序员,都需要对数据结构有深入的理解。 在本教程中,“数据结构”这一主题涵盖了许多关键概念,包括数组、链表、栈、队列、树...
6. **随机数据生成**:为了增加实际性和趣味性,程序会随机生成数据填充链表。这涉及到C语言中的随机数生成函数,如`srand()`和`rand()`。 这个项目对计算机科学的学生来说,是一个很好的实践机会,尤其是对于那些...
例如,查找操作可以通过优化,比如使用哈希表来加速查找速度,但原问题的设定可能更倾向于使用基本的链表操作,以锻炼对链表数据结构的理解和操作能力。 此外,考虑到实际编程中可能出现的错误情况,如无效的输入、...
数据结构是计算机科学中的核心概念,它...这种工具能够把理论知识转化为实践操作,让学习过程更生动、更具趣味性。因此,对于任何想要深入理解和掌握数据结构的人来说,数据结构演示软件都是一个不可或缺的学习资源。
这款软件覆盖了数据结构的主要内容,包括线性表、栈、队列、链表、树(如二叉树、AVL树和红黑树)、图和哈希表等。每一种数据结构在软件中都有详细的操作演示,学生可以通过可视化界面亲自动手进行数据插入、删除和...
在数据结构领域,基础且重要的概念包括数组、链表、栈、队列、树、图等。这些数据结构在实际的编程应用中扮演着关键角色,比如数组提供了快速访问元素的能力,链表则允许高效地插入和删除元素;栈用于实现回溯和递归...
这个系统提供了交互式的环境,使学习过程更具趣味性和实践性。对于初学者来说,它是一个很好的辅助工具,有助于快速掌握数据结构的基础知识,并能提升问题解决能力。在实际编程中,熟悉和灵活运用这些数据结构将极大...
罗聪的数据结构笔记以其独特的视角和生动的解释,使得这一通常被认为较为抽象和复杂的主题变得趣味盎然。这组笔记由一系列独立的Word文档组成,每个文档专注于一个特定的数据结构或算法,使得学习过程更为模块化和...
案例教学法的选择和设计需要注意趣味性、难易程度以及与生活的紧密联系。贪吃蛇游戏作为一个案例,能够让学生在具体情境中主动思考和积极讨论,有助于提高学生学习线性结构的兴趣和效率。 文章还指出了现有案例教学...
这个项目是哈尔滨工业大学2012级软件学院的一次课程设计任务,它将经典的扫雷游戏与道具元素相结合,增加了游戏的策略性和趣味性。 在数据结构课程中,扫雷游戏的设计涉及到了多种关键的数据结构概念。首先,游戏...
在数据结构的教材方面,《数据结构基础》(简称《数》)以其严谨性、启发性和趣味性成为了畅销教材,并不断更新版本以适应新的编程语言和技术发展。Knuth的《The Art of Computer Programming》第一卷虽然权威,但...
在当前的教育背景下,数据结构课程的讲授常常面临理论性过强、缺乏实际应用趣味性,导致学生理解困难和教学效果不佳的问题。文章《数据结构教学中的案例巧用》就针对这些问题提出了一种新的教学方法:引入案例驱动的...
本压缩包“懵逼数据结构.zip”提供了一种趣味性的方式学习C++实现的数据结构,通过图像和动态图的形式帮助理解这些复杂的概念。 首先,我们来看看“懵逼gif.gif”,这很可能是一个生动形象地展示数据结构工作原理的...
总的来说,《C++类和数据结构》是一本深度与趣味并重的教材,对于想要提升C++编程技能,特别是面向对象编程和数据结构理解的读者来说,是一份宝贵的资源。通过学习,你不仅能提升编程能力,还能培养解决问题的逻辑...
关于猴子吃桃问题的数据结构课程设计报告,是一个典型的算法与数据结构应用实例,旨在通过解决一个趣味性的问题来提升学生对数据结构的理解和编程能力。猴子吃桃问题源于中国古代的一道数学趣题,通常涉及递归和动态...
总结来说,《数据结构之教法例解》提供了一套完整而深入的教学方案,不仅仅满足于让学生理解数据结构的基本概念,更注重通过活动驱动、互动环节和编程实践,让学生将理论知识付诸实践,从而获得深刻的理解和技能。...
数据结构是计算机科学中至关重要的一个领域,它研究如何...总之,严蔚敏版的《数据结构讲义》是一份集实用性、趣味性和深度于一体的考研复习资料,对于准备计算机相关专业考试的学生来说,是一份不可或缺的学习指南。
该算法通过链表数据结构,将猴子按圈排列,并通过一个指针不断遍历,模拟数数的过程,以达到淘汰猴子直至最后剩下一个的目的。 链表数据结构的核心特点在于它的动态数组能力。与数组相比,链表不需要预先分配固定...