链表--如何实现链表的增删操作

如何实现链表的增删操作

1.链表

链表是一种最基本的数据结构,其存储特点如下:可以用任意一组存储单元来存储数据元素(存储单元可以不连续),除了存储每个数据元素ai的值外,还存储指示其后继元素的信息。这两部分组成的数据元素ai的存储映像称为结点。N个结点链接在一起称为链表,当结点只包含其后继信息的链表就称为单链表。

2.可定义如下链表类来存储结点信息

public class Node {
    int data;
    Node next = null;
    public Node(int data) {
        this.data = data;
    }

}

3.链表中最重要的两个操作就是向链表中插入元素和删除元素
(1)插入元素
         单链表的插入操作是将值为x的结点插入到链表的第i个结点的位置,即插入到元素ai-1与ai之间。具体步骤如下:

       1)找到元素ai-1的存储位置p;
       2)生成一个数据域为x的新结点s;
       3)设置p.next=s;
       4)设置s.next=ai。

(2)删除操作
         单链表的删除操作是将单链表的第i个结点删除。具体步骤如下:

       1)找到元素ai-1的存储位置p;
       2)令p.next直接指向ai的后继结点。

4.实现代码如下:

public class MyLinkedList {
    Node head = null; //链表头结点
    /**
     * 向链表中添加一个元素
     * @param data:添加的元素
     */
    public void addNode(int data){
        Node newNode = new Node(data);
        if(head == null){
            head = newNode;
            return;
        }
        Node temp = head;
        while(temp.next != null){
            temp = temp.next;
        }
        temp.next = newNode;
    }
    /**
     * 删除第index个基点
     * @param index:待删除结点索引
     * @return 成功返回true,失败返回false
     */
    public boolean deleteNode(int index){
        //如果删除元素位置不合理
        if(index<1 || index>length()){
            return false;
        }
        //删除第index个结点的元素
        if(index == 1){
            head = head.next;
            return true;
        }
        int i = 2;
        Node preNode = head;
        Node curNode = head.next;
        while(curNode != null){
            if(i == index){
                preNode.next = curNode.next;
                return true;
            }
            preNode = curNode;
            curNode = curNode.next;
            i++;
        }
        return true;
    }
    /**
     * @return 返回链表的长度
     */
    public int length(){
        int length = 0;
        Node temp = head;
        while(temp != null){
            length++;
            temp = temp.next;
        }
        return length;
    }
    /**
     * 对链表进行排序
     * @return 返回排序后链表的头结点
     */
    public Node orderList(){
        int temp = 0;
        Node curNode = head;
        Node nextNode = null;
        while(curNode.next != null){
            nextNode = curNode.next;
            while(nextNode != null){
                if(curNode.data > nextNode.data){
                    temp = curNode.data;
                    curNode.data = nextNode.data;
                    nextNode.data = temp;
                }
                nextNode = nextNode.next;
            }
            curNode = curNode.next;
        }
        return head;
    }
    /**
     * 打印链表
     */
    public void printList(){
        Node temp = head;
        while(temp != null){
            System.out.print(temp.data);
            temp = temp.next;
        }
    }
    public static void main(String[] args) {
        MyLinkedList list = new MyLinkedList();
        list.addNode(2);
        list.addNode(1);
        list.addNode(2);
        list.addNode(3);
        list.addNode(5);
        System.out.println("before order:");
        list.printList();
        list.orderList();
        System.out.println();
        System.out.println("after order:");
        list.printList();
        list.deleteNode(2);
        System.out.println();
        System.out.println("删除第二个节点后:");
        list.printList();
    }
}

5.运行结果:
before order:
2 1 2 3 5
after order:
1 2 2 3 5
删除第二个节点后:
1 2 3 5

猜你喜欢

转载自blog.csdn.net/yangruxi/article/details/80301814