2.7 clear 方法
public void clear() { // 遍历链表 ListNode cur = this.head; while (cur != null) { ListNode curNext = cur.next; cur.prev = null; cur.next = null; cur = curNext; } this.head = null; this.last = null; this.size = 0; }
双向链表的清空方法可不能直接头节点置空,因为直接头节点置空的话,别忘了Java中是某一块空间没有被引用的时候,才会被自动回收掉,但是这是双向链表,中间节点都是互相引用的,所以我们需要每个都手动置空,我们要定义一个curNext引用,指向cur的下一个,防止置空cur的指针域的时候,cur找不到下一个节点了!最后别忘了 size 要等于 0,不然会出问题的! ̄︶ ̄∗ ̄︶ ̄∗)
2.8 size 方法
这个方法还是很很简单的,直接 return this.size; 不就可以了吗?
3、LinkedList 的学习
3.1 认识下 LinkedList
- LinkedList 并没有像 ArrayList 一样实现 RandomAccess 接口,所以 LinkedList 并不支持随机访问
- LinkedList 实现了Cloneable接口,表明 LinkedList 是可以clone的
- LinkedList 实现了Serializable接口,表明 LinkedList 是支持序列化的
- LinkedList 在任意位置插入和删除时效率比较高,时间复杂度为O(1)
接着来看一看 LinkedList 里面的成员变量:
3.2 LinkedList 的构造方法
Java 中的 LinkedList 提供了两个构造方法:
使用构造方法例子:
public static void main(String[] args) { // 构造一个空的双向链表 LinkedList<Integer> list1 = new LinkedList<>(); // 直接构造 List<Integer> list2 = new LinkedList<>(); // 向上转型 // 使用ArrayList构造LinkedList ArrayList<Integer> arrayList = new ArrayList<>(); arrayList.add(1); arrayList.add(2); arrayList.add(3); LinkedList<Integer> list3 = new LinkedList<>(arrayList); List<Integer> list4 = new LinkedList<>(arrayList); }
至于LinkedList当中还有特别多的方法,小伙伴们下去可以自行查阅手册,这里就不多讲述了!
3.3 LinkedList 的遍历
public static void main(String[] args) { LinkedList<Integer> list = new LinkedList<>(); for (int i = 1; i <= 5; i++) { list.add(i); //add默认是尾插 } // 方法1:使用foreach遍历 for (int x : list) { System.out.print(x + " "); } System.out.println(); // 方法2:使用迭代器遍历->正向遍历 ListIterator<Integer> it = list.listIterator(); while (it.hasNext()) { System.out.print(it.next() + " "); } System.out.println(); // 方法3:使用迭代器遍历->反向遍历 ListIterator<Integer> rit = list.listIterator(list.size()); while (rit.hasPrevious()) { System.out.print(rit.previous() + " "); } System.out.println(); }
迭代器后期也会逐步接触到,这里能看得懂就ok了!
4、ArrayList 和 LinkedList 的区别
首先我们来说它们的相同点,都是Java中的集合,都是顺序结构,都实现了 List 接口等其他的接口。
重点是他们的区别,也就是不同点!
- 从存储的角度来说,ArrayList 一定是空间连续的,因为底层是数组,数组是一块连续的存储空间,而 LinkedList 的空间不一定连续,每个节点是依靠节点的指针域进行连接起来的。
- 从访问元素的角度来说,ArrayList 支持下标随机访问,而 LinkedList 并不支持,而且时间复杂度还是 O(n)。
- 插入和删除的角度来说,ArrayList 尾插,尾删还好,其他都需要挪动元素了,效率低,时间复杂度是 O(n),而对于 LinkedList 来说,只需要修改指向即可,时间复杂度是 O(1)。
- 从空间的角度来说,ArrayList 容量不够需要扩容,而 LinkedList 并没有扩容的概念,每次插入都会 new 一个新的节点。
- 从应用场景的角度来说(目前的知识层面上),ArrayList 更适合频繁用到随机访问,而LinkedList 更适合频繁的插入和删除。