一、链表定义

链表通过指针将一组零散的内存块串联在一起进行使用。
数据格式:

根据上面的图展示,每个内存块可以称为链条的一个“结点”,结点包含了数据和下一个结点的地址;同时有2个结点特殊:第一个结点和最后一个结点,第一个结点称为“头节点”,存储链表基地址,最后一个结点称为“尾节点”,尾节点的下一个结点为空地址 NULL。

二、链表实现定义

public class LinkList<T> {
    //结点定义
    private class Node{
        //数据
        T item;
        //指向下一个结点
        Node next;
        //构造器
        public Node(T item,Node next){
            this.item = item;
            this.next = next;
        }
        public Node(T item){
            this.item = item;
        }
    }
    //头结点
    private Node head;
    //尾结点
    private Node tail;
    //结点个数
    private int size;

    //链表定义
    public LinkList(){
        this.head = new Node(null,null);
        size = 0;
    }
    }

三、查找特定位置的链表结点

//查找特定位置的链表结点
    public Node get(int index) {
        if (index <0 || index >=this.size){
            return null;
        }else{
            Node temp = this.head;
            for(int i =1;i<=index;i++){
                temp = temp.next;
            }
            return temp;
        }
    }

四、插入链表结点


注意:
将结点 x 的 next 指针指向结点 b,再把结点 a 的 next 指针指向结点 x,这样才不会丢失指针,导致内存泄漏。

//在链表的第i个位置插入一个值为t数据
    public void insert(int index ,T data) throws Exception{
        if(index <0 ||index > this.size){
            throw new Exception("插入超出范围");
        }else{
            Node newNode = new Node(data);
            //在头结点插入元素
            if (index ==0){
                if(this.size >0){
                    Node temp = head;
                    newNode.next = temp;
                }
                head = newNode;
            }
            //在尾结点插入元素
            else if(index == this.size){
                Node temp = tail;
                temp.next = newNode;
                this.tail  = newNode;

            }else{
                //在中间插入元素
                Node preNode = get(index-1);
                Node nextNode = preNode.next;
                newNode.next = nextNode;
                preNode.next = newNode;

            }

        }
        this.size ++;

        if(size == 1){
            tail = head;
        }
    }

五、删除链表结点

//删除特定位置的数据
    public void del(int index )throws Exception{
        if (index <0 ||index >=this.size){
            throw new Exception("删除超出范围");
        }else{
            //删除头结点
            if (index == 0){
                Node temp = this.head.next;
                this.head = temp;

            }else if(index == this.size-1){    //删除尾结点
                Node preNode = get(index -1);
                this.tail = preNode;
                preNode.next = null;
            }else{
                //删除中间结点
                Node preNode = get(index -1);
                Node nextNode = preNode.next.next;
                preNode.next = nextNode;
            }

        }
        this.size --;

    }

六、整体代码

public class LinkList<T> {
    //结点定义
    private class Node{
        //数据
        T item;
        //指向下一个结点
        Node next;
        //构造器
        public Node(T item,Node next){
            this.item = item;
            this.next = next;
        }
        public Node(T item){
            this.item = item;
        }
    }
    //头结点
    private Node head;
    //尾结点
    private Node tail;
    //结点个数
    private int size;

    //链表定义
    public LinkList(){
        this.head = new Node(null,null);
        size = 0;
    }

    //查找特定位置的链表结点
    public Node get(int index) {
        if (index <0 || index >=this.size){
            return null;
        }else{
            Node temp = this.head;
            for(int i =1;i<=index;i++){
                temp = temp.next;
            }
            return temp;
        }
    }

    public void add(T data){
        Node temp = new Node(data);
        //链表为空时
        if (this.size == 0){
            head = temp;
            tail = head;
        }else{
            Node last  =  tail;
            last.next = temp;
            this.tail = temp;
        }
        this.size ++;
    }

    //在链表的第i个位置插入一个值为t数据
    public void insert(int index ,T data) throws Exception{
        if(index <0 ||index > this.size){
            throw new Exception("插入超出范围");
        }else{
            Node newNode = new Node(data);
            //在头结点插入元素
            if (index ==0){
                if(this.size >0){
                    Node temp = head;
                    newNode.next = temp;
                }
                head = newNode;
            }
            //在尾结点插入元素
            else if(index == this.size){
                Node temp = tail;
                temp.next = newNode;
                this.tail  = newNode;

            }else{
                //在中间插入元素
                Node preNode = get(index-1);
                Node nextNode = preNode.next;
                newNode.next = nextNode;
                preNode.next = newNode;

            }

        }
        this.size ++;

        if(size == 1){
            tail = head;
        }
    }

    //删除特定位置的数据
    public void del(int index )throws Exception{
        if (index <0 ||index >=this.size){
            throw new Exception("删除超出范围");
        }else{
            //删除头结点
            if (index == 0){
                Node temp = this.head.next;
                this.head = temp;

            }else if(index == this.size-1){    //删除尾结点
                Node preNode = get(index -1);
                this.tail = preNode;
                preNode.next = null;
            }else{
                //删除中间结点
                Node preNode = get(index -1);
                Node nextNode = preNode.next.next;
                preNode.next = nextNode;
            }

        }
        this.size --;

    }
    //移除末尾元素,并返回对应数据
    public T remove() throws Exception{
        if (this.size ==0){
            throw new Exception("链表为空,无法移除");
        }
        //只有一个元素,移除后为空
        if (this.size == 1){
            T data = this.head.item;
            this.head = null;
            this.tail = this.head;
            this.size --;
            return data;
        }else{
            Node preNode = get(this.size-2);
            T data  = this.tail.item;
            preNode.next = null;
            this.tail = preNode;
            this.size --;
            return data;
        }

    }


    //删除特定元素的第一个位置
    public boolean deleteData(T data){
        boolean flag = false;
        if(this.size == 0){
            return flag;
        }else{
            Node curNode = this.head;
            //元素位于第一个结点
            if (curNode.item == data){
                Node nextNode = curNode.next;
                head = nextNode;
                flag = true;
                //当前列表只有一个结点
                if (this.size ==1){
                    tail = head;
                }
                this.size --;
            }else {
                while (curNode != null) {
                    Node nextNode = curNode.next;
                    if (nextNode != null && nextNode.item == data) {
                        //删除元素为尾结点
                        if (nextNode.next ==null){
                            this.tail = curNode;
                            curNode.next = null;
                        }else{
                            //删除结点为中间结点
                            Node temp = curNode.next.next;
                            curNode.next = temp;

                        }

                        flag = true;
                        this.size --;
                        break;
                    }
                    curNode = curNode.next;
                }
            }

        }
        return flag;
    }

    public void printLinkList(){
        if(this.size ==0){
            System.out.println("链表为空");
        }
        else {
            Node temp = head;
            System.out.print("目前的列表,头结点:" + head.item + ",尾结点:" + tail.item + ",整体:");
            while (temp != null) {
                System.out.print(temp.item + ",");
                temp = temp.next;
            }
            System.out.println();
        }

    }
    
    public static void main(String args[]) throws Exception {
        LinkList linkList = new LinkList();
        linkList.add("2");
        linkList.del(0);
        linkList.printLinkList();
        linkList.insert(0,"a");
        System.out.println("删除的元素为:"+linkList.remove());
        linkList.insert(0,"2");
        linkList.insert(1,"3");
        linkList.add("3");
        linkList.printLinkList();
        linkList.del(1);
        linkList.printLinkList();
        linkList.insert(1,"1");

        linkList.insert(0,"0");
        linkList.insert(2,"0");
        linkList.del(2);
        linkList.printLinkList();
        linkList.deleteData(3);
        linkList.printLinkList();



    }

}

更多推荐

java实现链表