数据结构与算法系列—链表

单链表

双向链表

循环链表

双向循环链表

链表与数据的内存分布

链表与数组的时间复杂度对比

单链表的基本操作

package com.datastructure.linkedlist;

/**
 * @Auther: dlm
 * @Date: 2020/4/5 00:02
 * @Description: 单链表的各种基本操作
 */
public class SingleLinkedList {


    public static class Node{

        private int data;   //存储数据,整型

        private Node next;  //指向下一个元素

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

        public int getData(){
            return data;
        }
    }
    
    //头结点
    private Node head = null;

    //通过值查找元素
    public Node findByValue(int data){
        Node p = head;
        while (p != null && p.data != data){
            p = p.next;
        }
        return p;
    }

    //通过下标查找元素
    public Node findByIndex(int index){
        Node p = head;
        int pos = 0;
        while(p != null && pos != index){
            p = p.next;
            pos++;
        }
        return p;
    }

    //无头结点
    //表头插入
    public void insertToHead(int value){
        Node newNode = new Node(value,null);
        insertToHead(newNode);
    }

    //表头插入
    public void insertToHead(Node newNode){
        if(head == null){
            head = newNode;
        }else{
            newNode.next = head;
            head = newNode;
        }
    }

    //表尾插入
    public void insertTail(int value){
        Node newNode = new Node(value,null);
        insertTail(newNode);
    }

    //表尾插入
    public void insertTail(Node newNode){
        if(head == null){
           head = newNode;
        }else{
            Node p = head;
            while (p.next != null){
                p = p.next;
            }
            newNode.next = p.next;
            p.next = newNode;
        }
    }

    //在某一结点后插入
    public void insertAfter(Node node,int value){
        Node newNode = new Node(value,null);
        insertAfter(node,newNode);
    }

    //在某一结点后面插入
    public void insertAfter(Node p,Node newNode){
        if(p == null){
            return;
        }
        newNode.next = p.next;
        p.next = newNode;
    }

    //在某一结点前面插入
    public void insertBefore(Node p,int value){
        Node newNode = new Node(value,null);
        insertBefore(p,newNode);
    }

    //在某一个结点前面插入
    public void insertBefore(Node p,Node newNode){
        if(p == null){
            return;
        }

        if(p == head){
            insertToHead(newNode);
            return;
        }

        Node q = head;

        while (q != null && q.next != p){
            q = q.next;
        }

        if(q == null)
            return;

        newNode.next = p;
        q.next = newNode;

    }

    //删除某个结点
    public void deleteByNode(Node p){
        if(p == null || head == null)
            return;

        if(p == head){
            head = head.next;
            return;
        }

        Node q = head;
        while (q != null && q.next != p){
            q = q.next;
        }

        if(q == null)
            return;

        q.next = q.next.next;

    }

    //通过值删除结点(只删除第一个值等于value的结点)
    public void deleteByFirstValue(int value){
        if(head == null)   return;

        Node p = head;
        Node q = null;
        while (p != null && p.data != value){
            q = p;
            p = p.next;
        }
        if(p == null)   return;

        //第一次 p != null && p.data == value时,即头结点的值等于value
        if(q == null){
            head = head.next;
        }else {
            p.next = p.next.next;
        }
    }

    //删除所有值等于value的结点
    public void deleteAllNodeByValue(int value){
        //前几个结点都等于value时,while循环全删掉
        while (head != null && head.data == value){
            head = head.next;
        }

        Node p = head;

        while (p != null){
            if(p.next.data == value){
                p.next = p.next.next;
                continue;
            }
            p = p.next;
        }

    }

    //打印所有结点的值
    public void printAll(){
        Node p = head;
        while (p != null){
            System.out.print(p.data + " ");
            p = p.next;
        }
        System.out.println();
    }
}
欢迎关注个人公众号,可直接扫描以下二维码或微信搜索“阿毛聊技术”。

posted @ 2020-04-04 15:21  limaodeng  阅读(130)  评论(0)    收藏  举报