`

链表的实现

阅读更多
/**  
 *   
 */   
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语言实现了这一功能,旨在帮助用户管理他们的联系人信息。下面我们将深入探讨这个系统所涉及的主要知识点。 首先,我们来了解**链表**这一数据结构。链表...

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

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

    用链表实现图书管理系统

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

Global site tag (gtag.js) - Google Analytics