Java容器-LinkedList

LinkedList简介

  LinkedList是基于双向链表实现的。链表是一种递归的数据结构,它或者为空(null),或者指向一个节点(node)的引用,该节点含有一个泛型的元素和一个指向另一条链表的引用,而双向链表的节点内含有两个指向另一条链表的引用。

用嵌套类定义节点

 1  private class Node<E>{
 2         E item;
 3         Node<E> next;
 4         Node<E> prev;
 5         Node( Node<E> prev,E item,Node<E> next){
 6             this.prev = prev;
 7             this.item = item;
 8             this.next = next;
 9         }
10 
11     }

LinkedList的构造函数

  LinkedList有两个构造函数,一个是无参数的构造函数,另一个是Collection类型的构造函数。

对双向链表的基本操作

  在头,尾添加元素。

 1 private void linkFirst(E e) {
 2         final Node<E> f = first;
 3         final Node<E> newNode = new Node<>(null, e, f);
 4         first = newNode;
 5         if (f == null)
 6             last = newNode;
 7         else
 8             f.prev = newNode;
 9         size++;
10     }
11 
12     void linkLast(E e) {
13         final Node<E> l = last;
14         final Node<E> newNode = new Node<>(l, e, null);
15         last = newNode;
16         if (l == null)
17             first = newNode;
18         else
19             l.next = newNode;
20         size++;
21     }

  在头,尾删除元素。

 1  private E unlinkFirst(Node<E> f) {
 2         final E element = f.item;
 3         final Node<E> next = f.next;
 4         f.item = null;
 5         f.next = null; 
 6         first = next;
 7         if (next == null)
 8             last = null;
 9         else
10             next.prev = null;
11         size--;
12         return element;
13     }
14 
15     private E unlinkLast(Node<E> l) {
16         final E element = l.item;
17         final Node<E> prev = l.prev;
18         l.item = null;
19         l.prev = null; 
20         last = prev;
21         if (prev == null)
22             first = null;
23         else
24             prev.next = null;
25         size--;
26         return element;
27     }

  删除任意位置元素。

 1  E unlink(Node<E> x) {
 2         final E element = x.item;
 3         final Node<E> next = x.next;
 4         final Node<E> prev = x.prev;
 5 
 6         if (prev == null) {
 7             first = next;
 8         } else {
 9             prev.next = next;
10             x.prev = null;
11         }
12 
13         if (next == null) {
14             last = prev;
15         } else {
16             next.prev = prev;
17             x.next = null;
18         }
19 
20         x.item = null;
21         size--;
22         return element;
23     }

  查找指定位置元素。

 1  Node<E> node(int index) {
 2         if (index < (size >> 1)) {
 3             Node<E> x = first;
 4             for (int i = 0; i < index; i++)
 5                 x = x.next;
 6             return x;
 7         } else {
 8             Node<E> x = last;
 9             for (int i = size - 1; i > index; i--)
10                 x = x.prev;
11             return x;
12         }
13     }

  由以上基本操作可以写出我们常用的方法,就不在这里多说。如果有不明白的推荐一本书《算法》第4版。书中第一章1.33小节详细讲述了链表。

  如有不对之处,欢迎留言指正!

 

转载于:https://www.cnblogs.com/tryinglove/p/7862483.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值