`

链表的实现

阅读更多
/**  
 *   
 */   
package link;   
   
/**  
 * @author sunxboy  
 *  
 */   
public class Node {   
   
    /**  
     * 链表结构的特征:  
     * 分二部分:  
     * 第一部分为数据  
     * 第二部分为地址,它指下一个节点  
     */   
    public int data;   
    public Node next;   
       
    public Node(int data) {   
        this.data=data;   
    }   
}   


/**  
 * 数据结构之链表  
 */   
package link;   
   
/**  
 * @author sunxboy 

 *  
 */   
public class LinkTable {   
   
    private Node head;   
       
    /**  
     * 在链表的最前面插入一个值  
     * @param data 要插的数据  
     * @return 是否成功  
     */   
    public boolean insertFirst(int data) {   
        Node node= new Node(data);   
        if(isEmpty()) {   
            head = node;   
            return true;   
        }   
        //将新插入的数的地址指向原来的第一位数   
        node.next = head;   
        //更新插入值后的新链表的头   
        head = node;   
        return true;   
    }   
       
    /**  
     * 在链表的最末插入一个值  
     * @param data 要插入的数据  
     * @return 是否成功  
     */   
    public boolean insertLast(int data) {   
        Node node = new Node(data);   
        if(isEmpty()) {   
            node = head;   
            return true;   
        }   
        Node p = head;   
        Node pre = head;   
        //遍历整个链表,从而最终得到一个最后的节点   
        while(!isEnd(p)) {   
            // 在向后移动之前得到一个节点   
            pre = p;   
            // 逐次向后移动   
            p = p.next;   
        }   
        // 将要插入的值插入到最后一个节点上   
        pre.next = node;   
        return false;   
    }   
       
    /**  
     * 在某节点前插入一新数据  
     * @param oldData 原节点  
     * @param newData 新节点  
     * @return 是否插入成功  
     */   
    public boolean insert(int oldData,int newData) {   
        Node preNode = find(oldData,true);   
        if(preNode==null) {   
            return false;   
        }   
        Node newNode = new Node(newData);   
        if(preNode==head) {   
            newNode.next=head;   
            head = newNode;   
        } else {   
            Node pNode = preNode.next;   
            newNode.next=pNode;   
            preNode.next=newNode;   
        }   
           
        return true;   
    }   
       
    /**  
     * 删除某一节点  
     * @param data 节点数据  
     * @return 是否删除成功  
     */   
    public boolean delete(int data) {   
        if(isEmpty()) {   
            return false;   
        }   
        Node preNode = find(data, true);   
        if(preNode == head) {   
            head = head.next;   
        }else {   
            Node pNode = preNode.next;   
            preNode.next=pNode.next;   
        }   
        return true;   
    }   
       
    /**  
     * 将某节点数据更新为新的数据  
     * @param oldData  
     * @param newData  
     * @return  
     */   
    public boolean update(int oldData,int newData) {   
        Node pNode = find(oldData, false);   
        if(pNode!=null) {   
            pNode.data = newData;   
            return true;   
        }   
        return false;   
    }   
       
    /**  
     * 查找数值为data的节点  
     * @param flag 为false时表示返回要找数据的节点,  
     *             为true时表示返回要找数据之前的节点  
     * @param data 要查找的数值  
     * @return   
     */   
    public Node find(int data,boolean flag) {   
   
        Node p = head;   
        Node pre = head;   
        while(!isEnd(p)&& p.data!= data) {   
           
            // 保存之前的信息   
            pre = p;   
            //逐次向后移动   
            p = p.next;   
        }   
        if(isEnd(p)) {   
            return null;   
        }   
        if(flag) return pre;   
        else return p;   
    }   
       
    /**  
     * 链表是否为空  
     * @return  
     */   
    public boolean isEmpty() {   
        return head==null;   
    }   
       
    /**  
     * 此节点是否是最后一个节点  
     * @param node 要判断的节点  
     * @return 是否是最后一个节点  
     */   
    public boolean isEnd(Node node) {   
        return node==null;   
    }   
       
    /**  
     * 显示链表所有节点信息  
     *  
     */   
    public void display() {   
        Node pNode = head;   
        while(pNode!=null) {   
            System.out.println(pNode.data);   
            pNode = pNode.next;   
        }   
   
    }   
       
    public static void main(String[] args) {   
        LinkTable lt=new LinkTable();   
        lt.insertFirst(1);   
        lt.insertFirst(2);   
        lt.insertFirst(3);   
        lt.insertLast(4);   
        lt.insertLast(5);   
        lt.insertLast(6);   
        lt.insert(4, -2);   
        lt.delete(6);   
        lt.delete(3);   
        lt.delete(4);   
        lt.update(1, 100000);   
        lt.display();   
    }   
} 
分享到:
评论

相关推荐

    数据结构 课程设计 用链表实现集合并集 c++

    本项目是关于“用链表实现集合并集”的C++课程设计,主要目的是掌握集合操作以及如何利用链表数据结构高效地实现这些操作。 首先,我们需要了解集合的基本概念。集合是一个无序且不包含重复元素的数学结构。在...

    C++ 链表实现两个一元多项式相加

    总的来说,C++中链表实现一元多项式的加法是一种巧妙而实用的方法,它结合了数据结构和算法的知识,展示了计算机科学的魅力。通过熟练掌握这样的编程技巧,不仅可以提高编程能力,还能为解决更复杂的问题打下坚实的...

    STM32用链表实现多级菜单

    综上所述,用链表实现STM32的多级菜单是一个涉及数据结构、内存管理、事件处理和用户界面设计等多个方面的综合性任务。通过熟练掌握这些知识点,我们可以创建出高效、易用且可扩展的嵌入式系统用户界面。

    用数据结构-链表实现通讯录管理系统

    本项目以"用数据结构-链表实现通讯录管理系统"为主题,通过C语言实现了这一功能,旨在帮助用户管理他们的联系人信息。下面我们将深入探讨这个系统所涉及的主要知识点。 首先,我们来了解**链表**这一数据结构。链表...

    链表实现集合运算 链表实现集合交并差运算

    链表实现集合运算 链表实现集合交并差运算

    用链表实现图书管理系统

    ### 使用链表实现图书管理系统的知识点 #### 一、链表基本概念 链表是一种常见的数据结构,由一系列节点组成,每个节点包含实际存储的数据和一个指向下一个节点的引用(指针)。在本例中,链表用于实现图书管理系统...

    用链表实现线性表java

    链表实现线性表的基本操作包括添加元素(插入)、删除元素、查找元素以及遍历等。在`ChainList.java`文件中,可能会定义一个名为`Node`的类来表示链表节点,如下所示: ```java class Node { int data; Node next...

    C语言链表实现学生信息管理

    ### 题目:C语言链表实现学生信息管理 #### 描述: 这是一个用C语言编写的简单程序,通过链表技术实现了学生信息的管理功能。用户可以通过简单的命令行界面执行各种操作,如添加、删除、修改、查询学生信息以及保存...

    C语言学生考试系统(链表实现)

    《C语言学生考试系统——链表实现》 在信息技术领域,C语言作为一种基础且强大的编程语言,被广泛用于系统编程、软件开发以及教学实训。本项目“C语言学生考试系统”便是利用C语言来实现的一个简易考试管理工具,其...

    Go-LinkedList一个简单的双链表实现

    本文将深入探讨Go语言中的双链表实现,以标题"Go-LinkedList一个简单的双链表实现"为例,我们将分析双链表的设计、操作以及其在实际应用中的价值。 双链表是一种线性数据结构,每个节点包含两个指针,分别指向前后...

    链表实现栈和队列(经典程序)

    在"delimetermach.cpp"这个源代码文件中,很可能包含了具体的链表实现栈和队列的C++代码。通过阅读和分析这段代码,我们可以深入理解如何使用C++的指针和结构体来构建链表节点,以及如何通过指针操作来实现栈的压栈...

    图书管理系统(C语言链表实现)含实验报告

    大学期间用C语言链表实现的一个图书管理系统,主要功能有 a. 设备申请。由专业人员填写“申请表”送交领导批准购买。 b. 设备入库。新设备购入后要立即进行设备登记(包括类别、设备名、型号、规格、单价、数量、...

    航空订票系统--链表实现.rar

    《航空订票系统--链表实现》 在IT行业中,航空订票系统是航空公司和旅行代理机构的关键组成部分,它负责管理航班信息、座位预订、乘客信息等重要数据。本项目着重探讨了如何利用链表这一数据结构来实现航空订票系统...

    大数相乘通用链表实现

    通用链表实现是解决这个问题的一种高效方法,它能够处理任意长度的整数,不受固定大小数据类型的限制。本篇文章将深入探讨如何利用链表结构来实现大数相乘,并分析其工作原理和优化策略。 首先,链表是一种动态数据...

    数组和链表实现队列

    5. **优缺点**:链表实现队列时,入队和出队操作通常较快,因为无需移动其他元素。但相比于数组,链表的随机访问性能较差,因为需要遍历找到特定位置的节点。 **对比与选择** 数组和链表实现队列各有优势,具体...

    c#版的双向链表实现

    总结,C#版的双向链表实现涉及到泛型、接口和类设计等多个核心编程概念。通过这些工具,我们可以创建一个灵活、高效且可复用的数据结构,以满足各种程序需求。在实际开发中,理解和掌握这些概念对于提升代码质量至关...

    账号管理系统的链表实现

    在链表实现中,可以考虑结合这两种方法,为不同的查询场景提供优化。 密码退格功能是指用户在输入密码时能撤销最近一次输入的操作。在链表实现中,可以维护一个额外的链表,用于存储用户的输入历史,每次退格操作就...

    链表实现单词本管理.docx

    C语言链表实现单词本管理 本文档主要介绍了使用C语言实现单词本管理系统的设计和实现过程。该系统使用链表结构来存储单词及其对应的中文解释,并提供了插入、删除、查找和输出单词的功能。 1. 链表结构的实现 在...

    用链表实现多项式_C++_

    总的来说,用链表实现多项式运算是一种灵活且高效的方法,它可以方便地处理任意大小的多项式,并支持各种算术操作。链表的动态特性使得这种实现方式具有很高的可扩展性,可以适应不同的问题需求。

    长整型相乘,链表实现。

    本文将深入探讨一种利用链表实现长整型相乘的算法。 链表是一种线性数据结构,它由一系列节点组成,每个节点包含数据和指向下一个节点的引用。这种数据结构特别适合存储动态增长的序列,因为可以在运行时轻松添加或...

Global site tag (gtag.js) - Google Analytics