`
阅读更多

链表

一、何谓链表
链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针(Pointer)访问特定编号的节点。链表不同于数组,数组是有序的而链表是无序无,链表的逻辑顺序通过链表中的指针链接次序实现。链表由节点组成,而节点又有两部分组成,分别为存储数据的数据域与存储下一节点地址的引用指针域。

二、链表的分类
链表可以分为单链表,双链表,循环链表。
单链表:具有头结点尾节点和若干个中间节点,各节点之间通过引用指针链接;
双链表:其实就是单链表中的引用指针具有相反的两个方向,能相互指向;
循环链表:将单链表的头结点与尾节点通过引用指针链接起来就形成了环状结构的循环链表。

三、链表的优点与缺点
优点:链表最明显的好处就是,常规数组排列关联项目的方式可能不同于这些数据项目在记忆体或磁盘上顺序,数据的存取往往要在不同的排列顺序中转换。而链表是一种自我指示数据类型,因为它包含指向另一个相同类型的数据的指针(链接)。链表允许插入和移除表上任意位置上的节点,但是不允许随机存取。相较于数组(有序,大小固定),链表比较方便插入和删除数据(节点)的操作。
缺点:线性表的链式存储表示,有一个缺点就是要找一个数,必须要从头开始找起,十分麻烦。

四、链表的简单实现:
以下是我实现的单向链表:
1、节点类:

public class Node {


 public Object obj; 


 public Node next;//引用

public Node(Object obj) {

 this.obj=obj;
 }
 public void setObj(Object obj){
 this.obj=obj;
 }
 public Object getObject(){
 return obj;
 }
}

 
2、链表类:

public class Linkedlist {
 private Node root;//头节点
private Node rear;//尾节点
private int size;//记录节点总数的计数器


//添加节点到链表中的方法
public void add(Object obj){
 Node node = new Node(obj);

 if(root==null){//表示第一次添加节点
root = node;
 rear = node;
 }else{
 rear.next= node;
 rear = node;
 }
 size++;
 }

 //查找、获取数据
public Object get(int index){
 if(index < 0 || index >= size){
 throw new RuntimeException("索引越界!");
 }
if(index == 0){
 return root.obj;
 }
 Node node = root;
 for(int i=0;i<index;i++){
 node = node.next;
 }
 return node.obj;//返回数据
}

 //根据索引删除
public Object remove(int index){
 if(index < 0 || index >= size){
 throw new RuntimeException("索引越界!");
 }else{

 Node node = root;
 for(int i=0;i<index-1;i++){//找到索引节点的上一个
node=node.next;
 }
 Node nodetemp = node.next;//索引节点(即要删除的节点)
node.next =nodetemp.next ;//将索引从nodetemp的上一个指向nodetemp的下一个
size--;
return nodetemp.obj;//返回数据
}
 }
 //修改
public void redo(int index,Object obj){
 if(index < 0 || index >= size){
 throw new RuntimeException("索引越界!");
 }else{

 Node node = root;
 for(int i=0;i<index;i++){
 node=node.next;
 }
 node.setObj(obj);
 }
 }
 public int size(){
 return size;//统计链表内的节点个数
}
}

 
3、测试类:

public class Test {

 public static void main(String[] args) {

 Linkedlist ll =new Linkedlist();

 for(int i=0;i<8;i++){

 Object obj1=new Object("张三"+i,i);
 ll.add(obj1);
 }

 //添加
Object obj_1=new Object("王五         ",300);
 ll.add(obj_1);

 //查找数据
System.out.println("查找的数据为:");
ll.get(6).Show();

 //移除数据
System.out.println("移除的数据为:");
ll.remove(3).Show();

 //修改数据
Object obj=new Object("李四          ",100);
 ll.redo(0, obj);
 Print(ll); 

 }
 public static void Print(Linkedlist ll){

 for(int t=0;t<ll.size();t++){
 Object obj=ll.get(t);
 obj.Show();
 } 
 }
}

 
 2014 11 16
    梣梓

 

 

分享到:
评论

相关推荐

    循环链表和双向链表

    循环链表是一种特殊的链表结构,其特点在于链表的最后一个节点的指针域不再指向空,而是指向前一个节点,这样整个链表形成一个闭合的环形结构。在循环链表中,由于没有明显的尾端,因此在进行算法操作时需要特别注意...

    关于链表的创建和对链表的操作

    在本文中,我们将深入探讨线性单链表的创建和操作,包括链表结点的定义、链表指针类型、创建链表结点的函数、创建线性表的函数、向链表末尾追加元素、获取链表元素地址、删除链表元素以及清空链表。 首先,链表结点...

    单向链表(一) 结构体、创建链表、遍历链表

    单向链表是一种基本的数据结构,它在计算机科学和编程中有着广泛的应用。与数组不同,链表中的元素不是在内存中连续存储的,而是通过指针连接起来。本篇文章将深入探讨单向链表的基本概念,包括其结构体定义、如何...

    07丨链表(下):如何轻松写出正确的链表代码?1

    【链表】是一种重要的数据结构,它不像数组那样在内存中连续存储,而是通过节点间的指针连接起来。链表的每个节点包含数据和指向下一个节点的指针,这种结构使得链表在插入和删除操作上相比数组更具优势,但同时也...

    链表类,对链表操作的封装,使用了类模版

    封装了链表的操作,功能有链表的创建,节点的添加(附加),插入(前插、后插和插入到链表头部),删除,得到节点数据,得到节点位置,得到节点总数,释放链表。 使用了类模版,使得可以让节点中的数据为任意类型,...

    单链表、双链表、循环链表的操作

    链表操作详解 链表是一种基本的数据结构,它在计算机科学和软件工程中有着广泛的应用。链表可以分为单链表、双链表和循环链表三种,下面我们将详细介绍这些链表的操作。 单链表 单链表是一种基本的链表结构,其中...

    PTA 两个有序链表序列的合并

    在编程领域,有序链表序列的合并是一个常见的问题,尤其在数据结构和算法的学习中占有重要地位。这个题目“PTA 两个有序链表序列的合并”主要涉及到链表的操作和合并策略,这对于理解和掌握链表操作有极大的帮助。...

    两个链表求交集(链表基础练习)

    在编程领域,链表是一种非常基础且重要的数据结构,它由一系列节点组成,每个节点包含数据和指向下一个节点的指针。本题目的核心是利用链表的基本操作找到两个链表的交集,这是一个常见的算法问题,对于理解和掌握...

    stm32f103 双向链表

    在这个项目中,我们讨论的是如何在STM32F103上实现一个双向链表的数据结构。双向链表是一种特殊的数据结构,它允许我们在列表中的节点之间进行前向和后向的移动,这在处理动态数据集合时非常有用。 首先,我们要...

    C语言实现多种链表快速排序

    链表是一种重要的数据结构,它在计算机科学中广泛应用于各种算法和程序设计中。快速排序是一种高效的排序算法,由英国计算机科学家C.A.R. Hoare在1960年提出,它的基本思想是通过一趟排序将待排记录分隔成独立的两...

    用MFC做的链表程序

    《MFC实现的链表程序解析》 在计算机科学领域,数据结构与算法是核心的基础,其中链表作为基础的数据结构之一,具有重要的理论和实践价值。本篇将深入探讨如何利用Microsoft Foundation Classes (MFC)框架来实现...

    从尾到头打印链表(C语言实现)

    在计算机科学中,链表是一种常见的数据结构,用于存储一系列有序元素。在链表中,元素不是连续存储的,而是通过指针连接。本话题主要关注如何使用C语言实现一个功能,即“从尾到头”打印链表,这个过程可能会涉及到...

    链表演示(基于MFC)

    链表是一种基础且重要的数据结构,它在计算机科学中扮演着不可或缺的角色,特别是在处理大量动态数据时。在本示例中,“链表演示(基于MFC)”是使用Microsoft Foundation Classes (MFC) 库来实现的一个链表的简单...

    C语言动态链表的建立

    C 语言动态链表的建立 C 语言动态链表的建立是计算机编程中的一种常见技术,用于存储和管理大规模数据。动态链表是一种动态分配内存的数据结构,能够根据实际情况自动调整存储空间。下面是一个使用 C 语言编写的...

    Qt基础练习,QGraphics制作可视化链表

    在本文中,我们将深入探讨如何使用Qt框架中的QGraphics模块来创建一个可视化的链表。Qt是一个跨平台的应用程序开发框架,广泛应用于图形用户界面(GUI)和非GUI应用程序的开发。QGraphics模块提供了一组高级图形视图...

    C语言链表题目(附答案).docx

    C语言链表题目详解 本资源摘要信息将详细解释C语言链表题目中的知识点,涵盖链表的建立、功能实现、指针、函数、动态结构建立等方面的知识。 一、链表的概念 链表是一种数据结构,它由多个节点组成,每个节点都...

    操作系统课设-线程安全的双向链表

    操作系统课程设计中实现线程安全的双向链表是一项重要的实践任务,这涉及到多线程编程、数据结构以及并发控制等核心知识点。在这个项目中,我们主要关注如何在多线程环境下构建一个能够正确操作(如插入、删除)而不...

    单向链表 代码架构

    单向链表是一种基本的数据结构,它在计算机科学和编程中有着广泛的应用。与数组不同,链表中的元素不是在内存中连续存储的,而是通过指针或引用连接在一起,形成一个逻辑上的线性序列。单向链表的每个节点包含两部分...

Global site tag (gtag.js) - Google Analytics