单链表3(数据结构)

导读:本篇文章讲解 单链表3(数据结构),希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

单链表1(数据结构)中完成了对单链表的基本操作,单链表2(数据结构)中通过添加尾指针tail对单链表1进行了优化,可是我们有没有发现,无论是单链表1还是单链表2只能对结点数据域为整型的进行操作。如果要对结点数据域为其它数据类型的结点进行操作,要去改结点中value的数据类型,所以我们不如直接定义成泛型,又因为Node类只为SingleLink类使用,所以索性将Node类定义成SingleLink类的内部类(内部类在Java内部类博客中有介绍)。
废话不多说,直接上原码!!!

List接口

public interface List<T>{
    void addHead(T value);
    void addTail(T value);
    void removeHead();
    void removeTail();
    void removeValue(T value);
    boolean comtains(T value);
}

SingleLink类

public class SingleLink<E extends Comparable<E>> implements List<E> {//单向链表
    private Node<E> head;//用来标记链表的起始位置
    private Node<E> tail;// 标记链表的末尾位置

    //头部添加
    @Override
    public void addHead(E value) {
        //新结点的next = 原来头部位置
//        Node newNode = new Node(value,null);
//        newNode.setNext(head);
        Node<E> newNode = new Node<>(value, head);
        if(head == null){ // 空链表,维护tail
            tail = newNode;
        }
        head = newNode;//更新新的头部结点位置
    }

    //尾部添加
    @Override
    public void addTail(E value) {
        Node<E> newNode = new Node<>(value, null);
        if (head == null) {
            head = newNode;
        }else {
            tail.setNext(newNode);
        }

        tail = newNode;
    }

    //删除头部
    @Override
    public void removeHead() {
        if (head == null) {
            System.out.println("链表为空");
            return;
        }
        //结点 == 1
        if (head.getNext() == null) {
            tail = null;
        }

        //结点>=2
        head = head.getNext();
    }

    //删除尾部
    @Override
    public void removeTail() {
        if (head == null) {
            System.out.println("链表为空");
            return;
        }


        //只有一个结点
        if (head.getNext() == null) {
            head = null;
            tail = null;
            return;
        }

        //大于等于两个结点
        Node<E> p = head;
        while (p.getNext() != null) {
            p = p.getNext();
            if (p.getNext().getNext() == null) {
                p.setNext(null);
            }
        }
        tail = p;
    }

    //删除特定结点
    @Override
    public void removeValue(E value) {
        //链表为空
        if (head == null) {
            System.out.println("链表为空");
            return;
        }
        //考虑第一个结点是要删除的结点
        if (head.getValue().compareTo(value) == 0) {
            removeHead();
            return;
        }

        //只有一个结点
        if (head.getNext() == null && head.getValue().compareTo(value) != 0) {
            System.out.println("没有该结点");
            return;
        }

        //大于等于两个结点
        Node<E> p = head;
        while (p.getNext().getValue().compareTo(value) != 0) {
            p = p.getNext();
        }
        if (p.getNext() == null) {
            System.out.println("没有该结点");
        }
        //如果最后一个结点为待删结点
        if (p.getNext() == tail) {
            tail = p;
        }

        p.setNext(p.getNext().getNext());
    }

    //查找特定结点
    @Override
    public boolean comtains(E value) {
        if (head == null) {
            System.out.println("链表为空");
            return false;
        }

        for (Node<E> p = head; p != null; p = p.getNext()) {
            if (p.getValue().compareTo(value) == 0) {
                return true;
            }
        }
        return false;
    }

    //打印
    public void show() {
        for (Node p = head; p != null; p = p.getNext()) {
            System.out.print(p.getValue() + " ");
        }
        System.out.println();
    }

    //内部类
    public static class Node<T> {
        private T value;
        private Node<T> next;

        public Node(T value, Node<T> next) {
            this.value = value;
            this.next = next; //下一个结点的地址
        }

        public T getValue() {
            return value;
        }

        public Node<T> getNext() {
            return next;
        }

        public void setValue(T value) {
            this.value = value;
        }

        public void setNext(Node<T> next) {
            this.next = next;
        }
    }

}

TestDemo测试类

public class TestDemo {
    public static void main(String[] args) {
        SingleLink<String> singleLink = new SingleLink<>();
        singleLink.addHead("abc");
        singleLink.addHead("hello");
        singleLink.addHead("world");
        singleLink.addHead("Java");
        singleLink.show();
        singleLink.addTail("HELLO");
        singleLink.show();
        singleLink.removeHead();
        singleLink.show();
        singleLink.removeTail();
        singleLink.show();
        singleLink.removeValue("hello");
        singleLink.show();
        if (singleLink.comtains("abc")){
            System.out.println("有该结点");
        }else {
            System.out.println("没有该结点");
        }

    }
}

运行结果演示

演示操作value值为String类型,如TestDemo测试类。
在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/95556.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!