LinkedList类 (链表)

目录

一. LinkedList 基本介绍

 二. LinkedList 中的法及其应用

1. 添加元素

(1) add()

(2) addAll()

(3) addFirst()

(4) addLast()

2. 删除元素

(1) remove()

(2) removeAll()

(3) removeFirst()

(4) removeLast()

3. 遍历元素

(1) for 循环遍历

(2) for - each 遍历

(3) 迭代器遍历

(4) 列表迭代器遍历

4. 判断

(1) cotains()

(2) containsAll()

(3) isEmpty()

三. 模拟实现 LinkedList

1. 使用单向链表模拟实现

2. 使用双向链表模拟实现


一. LinkedList 基本介绍

(1)LinkedList (链表) 继承于 List接口, 是Java集合框架的一部分.

(2) LinkedList 用于存放可重复, 有序的元素.

(3) LinkedList 底层使用双向链表来实现.

(4) LinkedList 的特点是 插入/删除 的速度快 (因为可以直接通过下标查找), 查找 元素的速度慢(因为需要先遍历链表找到对应元素).

 二. LinkedList 中的法及其应用

通过查看文档我们可以看到, LinkedList 类主要有以上几种方法. 我把其中比较重要的几个方法勾选了出来, 这些我们要重点熟悉掌握. 大家也可以自行翻阅文档进行学习. 

首先我们要在list里存放对象. 假设我们要存放Student类型的对象.

首先定义学生类:

public class Student {
    private String name;
    private int age;
    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }
 
    public String getName() {
        return name;
    }
 
    public int getAge() {
        return age;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public void setAge(int age) {
        this.age = age;
    }
 
    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
 
    @Override
    public boolean equals(Object obj) {
        if (this == obj) {  //1. 如果this和obj指向同一个对象, 则返回true;
            return true;
        }
        if (obj instanceof Student) {  //2. 如果this和obj指向不同对象, 而且obj是Student类型的
            if (this.age == ((Student) obj).getAge() && this.name == ((Student) obj).getName()) {
                return true;
            }
            return false;
        }
        return false;
    }
}

1. 添加元素

(1) add()

add() 方法, 有两个版本: 版本一有一个参数, 版本二有两个参数. 

[1] add(E e)  将指定元素添加到末尾

import java.util.LinkedList;

public class demo {
    public static void main(String[] args) {
        Student s1 = new Student("刘德华",22);
        Student s2 = new Student("梁朝伟",24);
        Student s3 = new Student("吴彦祖",26);

        LinkedList<Student> linkedList = new LinkedList<>();
        linkedList.add(s1);
        linkedList.add(s2);
        linkedList.add(s3);
        System.out.println(linkedList);
    }
}

 

[2] add(int index, E element)  将指定元素插入指定位置.

import java.util.LinkedList;

public class demo {
    public static void main(String[] args) {
        Student s1 = new Student("刘德华",22);
        Student s2 = new Student("梁朝伟",24);
        Student s3 = new Student("吴彦祖",26);

        LinkedList<Student> linkedList = new LinkedList<>();
        linkedList.add(s1);
        linkedList.add(s2);
        linkedList.add(s3);
        System.out.println(linkedList);

        Student s4 = new Student("Jack",45);
        linkedList.add(1,s4);
        System.out.println(linkedList);
    }
}

(2) addAll()

addAll() 方法的基本作用是将一个列表添加到另一个列表中去. 与add() 类似, addAll() 方法也有两个版本:

[1] addAll(Collection e) 表示将另一列表添加到当前列表之后.

import java.util.LinkedList;

public class demo {
    public static void main(String[] args) {
        Student s1 = new Student("刘德华",22);
        Student s2 = new Student("梁朝伟",24);
        Student s3 = new Student("吴彦祖",26);

        LinkedList<Student> linkedList = new LinkedList<>();
        linkedList.add(s1);
        linkedList.add(s2);
        linkedList.add(s3);

        System.out.println(linkedList); // 打印linkedList

        Student s4 = new Student("Jack",45);
        Student s5 = new Student("Bob", 55);
        Student s6 = new Student("Molly",31);

        LinkedList<Student> linkedList1 = new LinkedList<>();
        linkedList1.add(s4);
        linkedList1.add(s5);
        linkedList1.add(s6);

        System.out.println(linkedList1); // 打印linkedList1

        linkedList.addAll(linkedList1);
        System.out.println(linkedList); // 打印合并之后的linkedList
    }
}

 [2] addAll(intindex, Collection e) 表示在指定位置插入另一列表.

import java.util.LinkedList;

public class demo {
    public static void main(String[] args) {
        Student s1 = new Student("刘德华",22);
        Student s2 = new Student("梁朝伟",24);
        Student s3 = new Student("吴彦祖",26);

        LinkedList<Student> linkedList = new LinkedList<>();
        linkedList.add(s1);
        linkedList.add(s2);
        linkedList.add(s3);

        System.out.println(linkedList);

        Student s4 = new Student("Jack",45);
        Student s5 = new Student("Bob", 55);
        Student s6 = new Student("Molly",31);

        LinkedList<Student> linkedList1 = new LinkedList<>();
        linkedList1.add(s4);
        linkedList1.add(s5);
        linkedList1.add(s6);

        System.out.println(linkedList1);

        linkedList.addAll(1,linkedList1);
        System.out.println(linkedList);
    }
}

(3) addFirst()

头插. 即在链表的第一个节点之前插入

import java.util.LinkedList;

public class demo {
    public static void main(String[] args) {
        Student s1 = new Student("刘德华",22);
        Student s2 = new Student("梁朝伟",24);
        Student s3 = new Student("吴彦祖",26);

        LinkedList<Student> linkedList = new LinkedList<>();
        linkedList.add(s1);
        linkedList.add(s2);
        linkedList.add(s3);
        System.out.println(linkedList);

        Student s4 = new Student("Jack",45);
        linkedList.addFirst(s4);
        System.out.println(linkedList);
    }
}

 

(4) addLast()

尾插. 即在链表的最后一个节点之后插入

import java.util.LinkedList;

public class demo {
    public static void main(String[] args) {
        Student s1 = new Student("刘德华",22);
        Student s2 = new Student("梁朝伟",24);
        Student s3 = new Student("吴彦祖",26);

        LinkedList<Student> linkedList = new LinkedList<>();
        linkedList.add(s1);
        linkedList.add(s2);
        linkedList.add(s3);
        System.out.println(linkedList);

        Student s4 = new Student("Jack",45);
        linkedList.addLast(s4);
        System.out.println(linkedList);
    }
}

 

 

2. 删除元素

(1) remove()

remove() 方法, 参数可以传递下标, 也可以传递对象的引用. 作用都是把指定节点删除掉. 代码演示如下:

import java.util.LinkedList;

public class demo {
    public static void main(String[] args) {
        Student s1 = new Student("刘德华",22);
        Student s2 = new Student("梁朝伟",24);
        Student s3 = new Student("吴彦祖",26);

        LinkedList<Student> linkedList = new LinkedList<>();
        linkedList.add(s1);
        linkedList.add(s2);
        linkedList.add(s3);
        System.out.println(linkedList);

        linkedList.remove(0); // 传递下标删除元素
        System.out.println(linkedList);
        linkedList.remove(s2); // 传递对象删除元素
        System.out.println(linkedList);
    }
}

(2) removeAll()

与add()和addAll()的关系类似, remove()方法是删除单个元素, removeAll()方法是从一个列表里删除另一个列表中的所有元素.

因为我们在Student里重写了equals()方法, 所以只要两个对象的name和age属性一样, 那么就认为这两个对象是相同的.

import java.util.LinkedList;

public class demo {
    public static void main(String[] args) {
        Student s1 = new Student("刘德华",22);
        Student s2 = new Student("梁朝伟",24);
        Student s3 = new Student("吴彦祖",26);

        LinkedList<Student> linkedList = new LinkedList<>();
        linkedList.add(s1);
        linkedList.add(s2);
        linkedList.add(s3);

        System.out.println(linkedList);

        LinkedList<Student> linkedList1 = new LinkedList<>();
        linkedList1.add(s1);
        linkedList1.add(s2);

        System.out.println(linkedList1);

        linkedList.removeAll(linkedList1);
        System.out.println(linkedList);
    }
}

(3) removeFirst()

删除并返回链表第一个元素.

import java.util.LinkedList;

public class demo {
    public static void main(String[] args) {
        Student s1 = new Student("刘德华",22);
        Student s2 = new Student("梁朝伟",24);
        Student s3 = new Student("吴彦祖",26);

        LinkedList<Student> linkedList = new LinkedList<>();
        linkedList.add(s1);
        linkedList.add(s2);
        linkedList.add(s3);
        System.out.println(linkedList);

        linkedList.removeFirst(); 
        System.out.println(linkedList);
    }
}

 

注意, 上面代码中的 removeFirst() 有返回值, 但是我们没有接收. 

(4) removeLast()

删除并返回链表最后一个元素.

import java.util.LinkedList;

public class demo {
    public static void main(String[] args) {
        Student s1 = new Student("刘德华",22);
        Student s2 = new Student("梁朝伟",24);
        Student s3 = new Student("吴彦祖",26);

        LinkedList<Student> linkedList = new LinkedList<>();
        linkedList.add(s1);
        linkedList.add(s2);
        linkedList.add(s3);
        System.out.println(linkedList);

        linkedList.removeLast();
        System.out.println(linkedList);
    }
}

 

3. 遍历元素

(1) for 循环遍历
import java.util.LinkedList;

public class demo {
    public static void main(String[] args) {
        Student s1 = new Student("刘德华",22);
        Student s2 = new Student("梁朝伟",24);
        Student s3 = new Student("吴彦祖",26);

        LinkedList<Student> linkedList = new LinkedList<>();
        linkedList.add(s1);
        linkedList.add(s2);
        linkedList.add(s3);

        for (int i = 0; i < linkedList.size(); i++) {
            System.out.println(linkedList.get(i));
        }
    }
}

(2) for - each 遍历
import java.util.LinkedList;

public class demo {
    public static void main(String[] args) {
        Student s1 = new Student("刘德华",22);
        Student s2 = new Student("梁朝伟",24);
        Student s3 = new Student("吴彦祖",26);

        LinkedList<Student> linkedList = new LinkedList<>();
        linkedList.add(s1);
        linkedList.add(s2);
        linkedList.add(s3);

        for (Student stu: linkedList) {
            System.out.println(stu);
        }
    }
}

(3) 迭代器遍历
import java.util.Iterator;
import java.util.LinkedList;

public class demo {
    public static void main(String[] args) {
        Student s1 = new Student("刘德华",22);
        Student s2 = new Student("梁朝伟",24);
        Student s3 = new Student("吴彦祖",26);

        LinkedList<Student> linkedList = new LinkedList<>();
        linkedList.add(s1);
        linkedList.add(s2);
        linkedList.add(s3);

        Iterator<Student> iterator = linkedList.iterator();
        while (iterator.hasNext()) {
            System.out.println(iterator.next());
        }
    }
}

(4) 列表迭代器遍历
  • 正序遍历:
import java.util.Iterator;
import java.util.LinkedList;
import java.util.ListIterator;

public class demo {
    public static void main(String[] args) {
        Student s1 = new Student("刘德华",22);
        Student s2 = new Student("梁朝伟",24);
        Student s3 = new Student("吴彦祖",26);

        LinkedList<Student> linkedList = new LinkedList<>();
        linkedList.add(s1);
        linkedList.add(s2);
        linkedList.add(s3);

        ListIterator<Student> iterator = linkedList.listIterator();
        while (iterator.hasNext()) {
            System.out.println(iterator.next());
        }
    }
}

  • 逆序遍历: 
import java.util.Iterator;
import java.util.LinkedList;
import java.util.ListIterator;

public class demo {
    public static void main(String[] args) {
        Student s1 = new Student("刘德华",22);
        Student s2 = new Student("梁朝伟",24);
        Student s3 = new Student("吴彦祖",26);

        LinkedList<Student> linkedList = new LinkedList<>();
        linkedList.add(s1);
        linkedList.add(s2);
        linkedList.add(s3);

        ListIterator<Student> iterator = linkedList.listIterator(linkedList.size()); // 相当于把迭代器插入到 size() 位置的前面. 从这里开始遍历
        while (iterator.hasPrevious()) {
            System.out.println(iterator.previous());
        }
    }
}

[注]: 这里我们需要注意一点:  给 listIterator() 传参数 就表示将迭代器插入到index位置的前面

 所以这里给listIterator() 传了一个arrayList.size(), 就相当于把迭代器插入到了 size() 位置的前面

4. 判断

(1) cotains()
public class demo {
    public static void main(String[] args) {
        Student s1 = new Student("刘德华",22);
        Student s2 = new Student("梁朝伟",24);
        Student s3 = new Student("吴彦祖",26);

        LinkedList<Student> linkedList = new LinkedList<>();
        linkedList.add(s1);
        linkedList.add(s2);
        linkedList.add(s3);

        System.out.println(linkedList.contains(new Student("吴彦祖", 26)));
        System.out.println(linkedList.contains(new Student("周润发", 50)));
    }
}

(2) containsAll()
public class demo1 {
    public static void main(String[] args) {
        Student s1 = new Student("刘德华",22);
        Student s2 = new Student("梁朝伟",24);
        Student s3 = new Student("吴彦祖",26);

        LinkedList<Student> linkedList = new LinkedList<>();
        linkedList.add(s1);
        linkedList.add(s2);
        linkedList.add(s3);

        LinkedList<Student> linkedList1= new LinkedList<>();
        linkedList1.add(s1);
        linkedList1.add(s2);
        System.out.println(linkedList.containsAll(linkedList1));
    }
}

(3) isEmpty()

判断当前顺序列表是否为空.

public class demo {
    public static void main(String[] args) {
        Student s1 = new Student("刘德华",22);
        Student s2 = new Student("梁朝伟",24);
        Student s3 = new Student("吴彦祖",26);

        LinkedList<Student> linkedList = new LinkedList<>();
        linkedList.add(s1);
        linkedList.add(s2);
        linkedList.add(s3);

        System.out.println(linkedList.isEmpty());
        linkedList.clear();
        System.out.println(linkedList.isEmpty());
    }
}

三. 模拟实现 LinkedList

我们前面说, LinkedList 是基于双向链表实现的. 那么单向链表可不可以实现LinkedList呢? --> 同样是可以的. 我们分别用 单向链表双向链表 实现一次LInkedList~

为了实现起来简单, 我们自己实现LinkedList只能存放 int 类型的元素.

1. 使用单向链表模拟实现

  • 模拟链表代码:
public class MyLinkedList {
    class ListNode {
        public int val;  //值域
        public ListNode next; //指针域 (初值为null)
        public ListNode(int val) {
            this.val = val;
        }
    }
    ListNode head; //头指针
    public int size() {
        ListNode p = head;
        int count = 0;
        while (p != null) {
            count ++;
            p = p.next;
        }
        return count;
    }

    public void addLast(int val) {  //模拟实现addLast (尾插)
        ListNode newNode = new ListNode(val);
        if (head == null) {
            head = newNode;
        } else{
            ListNode p = head;
            while (p.next != null) {  //找尾结点
                p = p.next;
            }
            p.next = newNode;
        }
    }

    public boolean addFirst(int val) {  //模拟实现addFirst (头插)
        if (head == null) {
            return false;
        }
        ListNode newNode = new ListNode(val);
        newNode.next = head;
        head = newNode;
        return true;
    }

    public boolean addIndex(int index, int val) {  //模拟实现addIndex (在指定位置插入)
        if (index < 0 || index > size()) {
            System.out.println("输入的下标有误, 请检查");
            return false;
        }
        if (head == null) {
            return false;
        }
        ListNode newNode = new ListNode(val);
        // 找到index位置的前一个
        ListNode TargetPreviousNode = head;
        int stepCount = index-1;
        while (stepCount !=0) {
            TargetPreviousNode = TargetPreviousNode.next;
            stepCount--;
        }
        ListNode TargetNode = TargetPreviousNode.next;

        //添加节点
        TargetPreviousNode.next = newNode;
        newNode.next = TargetNode;

        return true;
    }


    public boolean removeLast() { //模拟实现removeLast (尾删)
        // 判空
        if (head == null) {
            return false;
        }
        // 找到尾结点的前一个节点
        ListNode p = head;
        while (p.next.next != null) {
            p = p.next;
        }
        p.next = null; // 删除尾结点
        return true;
    }
    public boolean removeFirst() {  //模拟实现removeLast (头删)
        //判空
        if (head == null) {
            return false;
        }
        //
        ListNode p = head.next; //p指向头结点的下一个结点.
        head.next = null;
        head = p;
        return true;
    }

    public boolean removeIndex(int index) {  //模拟实现removeIndex (删除指定位置的元素)
        if (head == null) {
            return false;
        }
        ListNode TargetPreviousNode = head;
        int stepCount = index-1;
        while (stepCount != 0) { //找到目标节点的前一个节点
            TargetPreviousNode = TargetPreviousNode.next;
        }
        ListNode TargetNode = TargetPreviousNode.next;

        // 删除目标节点
        TargetPreviousNode.next = TargetNode.next;
        TargetNode.next = null; // 给要删除节点的next域置空.

        return true;
    }
    public boolean removeKey(int data) {  //模拟实现removeKey (删除指定定值的元素)
        if (head == null) {
            return false;
        }
        int flag = 0;
        ListNode TargetPreviousNode = head;
        while (TargetPreviousNode.next != null) {
            if (TargetPreviousNode.next.val == data) {  //定位要删除节点的前一个节点
                ListNode TargetNode  = TargetPreviousNode.next;
                TargetPreviousNode.next = TargetNode.next;
                TargetNode.next = null;

                flag = 1;
            }
            TargetPreviousNode = TargetPreviousNode.next;
            if (TargetPreviousNode != null) {
                continue;
            } else {
                break;
            }
        }
        if (flag == 1) {  //删除成功
            return true;
        }
        return false;  //没有 val == data 的结点
    }

    public boolean contains(int val) {  //模拟实现contains (是否包含某一元素)
        ListNode p = head;
        while (p != null) {
            if (p.val == val) {
                return true;
            }
            p = p.next;
        }
        return false;
    }

    public boolean isEmpty() {  //判断当前链表是否为空
        if(head == null) {
            return true;
        }
        return false;
    }

    public void clear() {  //清空链表
        head = null;
    }

    @Override
    public String toString() {
        String str = "";
        ListNode p = head;
       while(p != null) {
            if (p == head){
                str += "[";
                str += head.val;
                str += ",";
                p = p.next;
                continue;
            }
            if (p.next == null) {
                str += p.val;
                str += "]";
                p = p.next;
                continue;
            }
            str += p.val;
            str += ",";
            p = p.next;
        }
        return str;
    }
}
  •  测试函数代码:
public class test {
    public static void main(String[] args) {
        MyLinkedList myLinkedList = new MyLinkedList();
        myLinkedList.addLast(1);
        myLinkedList.addLast(2);
        myLinkedList.addLast(3);
        myLinkedList.addLast(4);
        myLinkedList.addLast(5);
        myLinkedList.addLast(3);
        myLinkedList.addLast(3);
        System.out.println(myLinkedList);

        myLinkedList.addFirst(99);
        System.out.println(myLinkedList);

        myLinkedList.addIndex(2,88);
        System.out.println(myLinkedList);

        myLinkedList.removeLast();
        System.out.println(myLinkedList);

        myLinkedList.removeFirst();
        System.out.println(myLinkedList);

        myLinkedList.removeIndex(1);
        System.out.println(myLinkedList);

        myLinkedList.removeKey(3);
        System.out.println(myLinkedList);

        System.out.println(myLinkedList.contains(5));

        System.out.println(myLinkedList.isEmpty());
        myLinkedList.clear();
        System.out.println(myLinkedList.isEmpty());
    }
}

 

通过运行结果我们可以看到, 我们用单链表模拟实现的LInkedList是没有任何问题的. 

 

2. 使用双向链表模拟实现

  • 模拟链表代码:

public class MyTwoWayLinkedList {
    class ListNode {
        public int val;
        public ListNode next;  //next域, 存放后一个节点的地址
        public ListNode prev;  //prev域, 存放前一个节点的地址
        public ListNode(int val) {
            this.val = val;
        }
    }
    ListNode head; //头指针
    ListNode rear; //尾指针

    public void addLast(int val) {  //尾插
        ListNode newNode = new ListNode(val);
        if (head == null && rear == null) {
            head = rear = newNode;
        }
        rear.next = newNode;
        newNode.prev = rear;
        rear = newNode;
    }

    public void addFirst(int val) {  //头插
        ListNode newNode = new ListNode(val);
        if (head == null && rear == null) {
            head = rear = newNode;
            return;
        }
        newNode.next = head;
        head.prev = newNode;
        head = newNode;
    }

    public void addIndex(int index, int val) {  //插入到指定位置
        ListNode newNode  = new ListNode(val);
        if (head == null && rear == null && index == 0) {
            head = rear = newNode;
            return;
        }
        ListNode TargetNode = head;
        int stepCount = index;
        while (stepCount != 0) {
            TargetNode = TargetNode.next;
            stepCount--;
        }
        newNode.next = TargetNode;

        newNode.prev = TargetNode.prev;
        TargetNode.prev.next = newNode;

        TargetNode.prev = newNode;
    }

    public void removeLast() {  //尾删
        ListNode p = rear.prev;
        rear.prev.next = null;
        rear.prev = null;

        rear = p;
    }
    public void removeFirst() {  //头删
        ListNode p = head.next;
        head.next.prev = null;
        head.next = null;

        head = p;
    }
    public void removeIndex(int index) {  //删除指定位置的元素
        ListNode TargetNode = head;
        int stepCount = index;
        while(stepCount != 0) {
            TargetNode = TargetNode.next;
            stepCount--;
        }
        TargetNode.next.prev = TargetNode.prev;
        TargetNode.prev.next = TargetNode.next;

        TargetNode.next = null;
        TargetNode.prev = null;
    }
    public boolean removeKey(int data) {  //删除指定值的元素
        ListNode TargetNode = head;
        int flag = 0;
        while (TargetNode != null) {
            if (TargetNode.val == data) {
                if (TargetNode == head) {
                    removeFirst();
                    flag = 1;
                    TargetNode = TargetNode.next;
                    continue;
                }
                if (TargetNode == rear) {
                    removeLast();
                    flag = 1;
                    TargetNode = TargetNode.next;
                    continue;
                }
                ListNode TargetNextNode =TargetNode.next;

                TargetNode.next.prev = TargetNode.prev;
                TargetNode.prev.next = TargetNode.next;

                TargetNode = TargetNextNode;

                flag = 1;
            }
            TargetNode = TargetNode.next;
        }

        if (flag == 1) {  //删除成功
            return true;
        }else {
            System.out.println("不存在该值");
            return false;
        }
    }
    public boolean contains(int val) {
        ListNode p = head;
        while (p != null) {
            if (p.val == val) {
                return true;
            }
            p = p.next;
        }
        return false;
    };
    public boolean isEmpty() {
        if (head == null && rear == null) {
            return true;
        }
        return false;
    };
    public void clear() {
        head = rear = null;
    };

    @Override
    public String toString() {
        String str = "";
        ListNode p = head;
        while(p != null) {
            if (p == head){
                str += "[";
                str += head.val;
                str += ",";
                p = p.next;
                continue;
            }
            if (p == rear) {
                str += rear.val;
                str += "]";
                p = p.next;
                continue;
            }
            str += p.val;
            str += ",";
            p = p.next;
        }
        return str;
    }
}
  • 测试函数代码:
public class test {
    public static void main(String[] args) {
        MyTwoWayLinkedList myTwoWayLinkedList = new MyTwoWayLinkedList();
        myTwoWayLinkedList.addLast(1);
        myTwoWayLinkedList.addLast(2);
        myTwoWayLinkedList.addLast(3);
        myTwoWayLinkedList.addLast(4);
        myTwoWayLinkedList.addLast(5);
        myTwoWayLinkedList.addLast(3);
        myTwoWayLinkedList.addLast(3);
        System.out.println(myTwoWayLinkedList);

        myTwoWayLinkedList.addFirst(99);
        System.out.println(myTwoWayLinkedList);

        myTwoWayLinkedList.addIndex(1,88);
        System.out.println(myTwoWayLinkedList);

        myTwoWayLinkedList.removeLast();
        System.out.println(myTwoWayLinkedList);

        myTwoWayLinkedList.removeFirst();
        System.out.println(myTwoWayLinkedList);

        myTwoWayLinkedList.removeIndex(1);
        System.out.println(myTwoWayLinkedList);

        myTwoWayLinkedList.removeKey(3);
        System.out.println(myTwoWayLinkedList);

        System.out.println(myTwoWayLinkedList.contains(88));
        System.out.println(myTwoWayLinkedList.isEmpty());
        myTwoWayLinkedList.clear();
        System.out.println(myTwoWayLinkedList.isEmpty());
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/943928.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python毕业设计选题:基于Python的社区爱心养老管理系统设计与实现_django

开发语言&#xff1a;Python框架&#xff1a;djangoPython版本&#xff1a;python3.7.7数据库&#xff1a;mysql 5.7数据库工具&#xff1a;Navicat11开发软件&#xff1a;PyCharm 系统展示 管理员登录 管理员功能界面 用户管理 身体健康界面 公共书籍界面 借阅信息界面 归还…

第T4周:TensorFlow实现猴痘识别(Tensorboard的使用)

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 目标&#xff1a; 1、学习tensorboard的使用 具体实现&#xff1a; &#xff08;一&#xff09;环境&#xff1a; 语言环境&#xff1a;Python 3.10 编 译 器…

Gitlab17.7+Jenkins2.4.91实现Fastapi/Django项目持续发布版本详细操作(亲测可用)

一、gitlab设置&#xff1a; 1、进入gitlab选择主页在左侧菜单的下面点击管理员按钮。 2、选择左侧菜单的设置&#xff0c;选择网络&#xff0c;在右侧选择出站请求后选择允许来自webhooks和集成对本地网络的请求 3、webhook设置 进入你自己的项目选择左侧菜单的设置&#xff…

嵌入式硬件杂谈(七)IGBT MOS管 三极管应用场景与区别

引言&#xff1a;在现代嵌入式硬件设计中&#xff0c;开关元件作为电路中的重要组成部分&#xff0c;起着至关重要的作用。三种主要的开关元件——IGBT&#xff08;绝缘栅双极型晶体管&#xff09;、MOSFET&#xff08;金属氧化物半导体场效应晶体管&#xff09;和三极管&#…

Kafka数据迁移全解析:同集群和跨集群

文章目录 一、同集群迁移二、跨集群迁移 Kafka两种迁移场景&#xff0c;分别是同集群数据迁移、跨集群数据迁移。 一、同集群迁移 应用场景&#xff1a; broker 迁移 主要使用的场景是broker 上线,下线,或者扩容等.基于同一套zookeeper的操作。 实践&#xff1a; 将需要新添加…

我的秋招总结

我的秋招总结 个人背景 双非本&#xff0c;985硕&#xff0c;科班 准备情况 以求职为目的学习Java的时间大概一年。 八股&#xff0c;一开始主要是看B站黑马的八股文课程&#xff0c;背JavaGuide和小林coding还有面试鸭。 算法&#xff0c;250&#xff0c;刷了3遍左右 项目&…

构建全志 T113 Tina SDK

1、环境配置&#xff1a; 准备一个 Ubuntu 系统&#xff0c;可以是 WSL&#xff0c;虚拟机等&#xff0c;建议版本是 20.04。 1.1、安装必要的软件 进入系统后&#xff0c;输入下方命令安装需要的工具 &#xff1a; sudo apt update -y sudo apt full-upgrade -y sudo apt i…

Datawhale-AI冬令营二期

目录 一、番茄时钟&#xff08;1&#xff09;输入Prompt&#xff08;2&#xff09;创建 HTML 文件解析1&#xff1a;HTML结构解析2&#xff1a;计时器内容解析3&#xff1a;按钮区域解析4&#xff1a;脚本引用 &#xff08;3&#xff09;使用JavaScript实现时钟功能解析1&#…

初探C语言|C语言中有哪些操作符呢?

文章目录 前言算术操作符示例 移位操作符原码,反码 与补码正数负数计算 左移<<右移>> 位操作符例题 赋值操作符单目操作符sizeof 操作符 关系操作符逻辑操作符短路现象 条件操作符逗号表达式下标引用、函数调用和结构成员表达式求值算术转换操作符属性 欢迎讨论: 如…

学习记录:配置mybatisplus的分页查询插件,mybatis-plus-jsqlparser 依赖

来源官方文档:分页插件 | MyBatis-Plus 于 v3.5.9 起&#xff0c;PaginationInnerInterceptor 已分离出来。如需使用&#xff0c;则需单独引入 mybatis-plus-jsqlparser 依赖 配置Maven bom 在我们的配置文件&#xff0c;pom.xml中 <properties> 这个标签下面&#xf…

电子应用设计方案74:智能家庭对讲系统设计

智能家庭对讲系统设计 一、引言 智能家庭对讲系统作为智能家居的重要组成部分&#xff0c;为家庭成员之间以及与访客的沟通提供了便捷、高效的方式。本设计方案旨在打造一个功能强大、稳定可靠、操作简便且具有良好扩展性的智能家庭对讲系统。 二、系统概述 1. 系统目标 - 实…

数据库高安全—openGauss安全整体架构安全认证

openGauss作为新一代自治安全数据库&#xff0c;提供了丰富的数据库基础安全能力&#xff0c;并逐步完善各类高阶安全能力。这些安全能力涵盖了访问登录认证、用户权限管理、审计与追溯及数据安全隐私保护等。本章节将围绕openGauss安全机制进行源码解读&#xff0c;以帮助数据…

埃斯顿机器人程序模版案例,欢迎指点

埃斯顿机器人程序模版案例&#xff0c;欢迎指点

python监控数据处理应用服务Socket心跳解决方案

1. 概述 从网页、手机App上抓取数据应用服务&#xff0c;涉及到多个系统集成协同工作&#xff0c;依赖工具较多。例如&#xff0c;使用Frida进行代码注入和动态分析&#xff0c;以实现对网络通信的监控和数据捕获。在这样的集成环境中&#xff0c;手机模拟器、手机中应用、消息…

C# GDI+数码管数字控件

调用方法 int zhi 15;private void button1_Click(object sender, EventArgs e){if (zhi > 19){zhi 0;}lcdDisplayControl1.DisplayText zhi.ToString();} 运行效果 控件代码 using System; using System.Collections.Generic; using System.Drawing.Drawing2D; using …

药片缺陷检测数据集,8625张图片,使用YOLO,PASICAL VOC XML,COCO JSON格式标注,可识别药品是否有缺陷,是否完整

药片缺陷检测数据集&#xff0c;8625张图片&#xff0c;使用YOLO&#xff0c;PASICAL VOC XML&#xff0c;COCO JSON格式标注&#xff0c;可识别药品是否有缺陷&#xff0c;是否完整 有缺陷的标注信息&#xff1a; 无缺陷的标注信息 数据集下载&#xff1a; yolov11:https://d…

jenkins集成工具(一)部署php项目

目录 什么是CI 、CD Jenkins集成工具 一、Jenkins介绍 二、jenkins的安装和部署 环境部署 安装jenkins 安装gitlab 配置镜像源进行安装 修改密码 安装git工具 上传测试代码 Jenkins部署php项目wordpress 发布php代码 安装插件 测试代码发布 实现发布成功发送邮件…

Web开发:ORM框架之使用Freesql的分表分页写法

一、自动分表&#xff08;高版本可用&#xff09; 特性写法 //假如是按月分表&#xff1a;[Table(Name "log_{yyyyMM}", AsTable "createtime2022-1-1(1 month)")]注意&#xff1a;①需包含log_202201这张表 ②递增规律是一个月一次&#xff0c;确保他们…

【UE5.3.2】生成vs工程并rider打开

Rider是跨平台的,UE也是,当前现在windows上测试首先安装ue5.3.2 会自动有右键的菜单: windows上,右键,生成vs工程 生成的结果 sln默认是vs打开的,我的是vs2022,可以open with 选择 rider :Rider 会弹出 RiderLink是什么插

FFmpeg在python里推流被处理过的视频流

链式算法处理视频流 视频源是本地摄像头 # codinggbk # 本地摄像头直接推流到 RTMP 服务器 import cv2 import mediapipe as mp import subprocess as sp# 初始化 Mediapipe mp_drawing mp.solutions.drawing_utils mp_drawing_styles mp.solutions.drawing_styles mp_holis…