前段时间知乎面试,面试官出了一道题目实现单链表的插入、删除、计算长度,当时勉强写出来了,但是不是用的面向对象的思路写的,面试官叫我改成面向对象的方式。当时突然想到AQS的底层实现方式,就想仿照改一下。结果面试官说时间原因,就不写了。。。。。
AQS里面有一个头结点head和一个尾节点tail,刚开始head和tail都是没有初始化的,后面第一个进入阻塞对的第一个节点会在enq方法中初始化head,AQS中阻塞队列是不算head节点,head节点可以理解为当前拥有锁的节点。想了解更多的可以去看看AQS和ReentrantLock的源码。
思想我们也可以借鉴AQS,实现一个带头结点的单链表(注意头结点是不算在链表中),具体的代码如下:
package cn.cqupt.linked;
class Node {
int data;
Node next;
Node() {
}
Node(int data) {
this.data = data;
this.next = null;
}
}
public class LinkedOp {
// 头结点
private Node head;
// 链表的长度
private int size;
// 构造函数初始化头结点,也可以在插入第一个节点的时候初始化
LinkedOp(){
head = new Node();
}
// 头插法
public void insertFromHead(int data){
// 将data封装为Node节点
Node node = new Node(data);
// 如果链表为空,直接跟在head后面
i