目录
public class MyLinkedList {
private int size;
ListNode head;
class ListNode { //定义链表结构
int value;
ListNode next;
ListNode(int value) { //构造函数,用于构造一个结点
this.value = value;
this.next = null;
head = null;
}
}
}
private void insertHead(int data) {//时间复杂度O(1)
ListNode newData = new ListNode(data);//构造一个结点
newData.next = head; //栈内存的引用
head = newData;
size++;
}
private void insertNth(int data, int position) {//插入链表的中间,假设定义在第N个插入,O(n)
if (position == 0){//这里表示插入在头部
insertHead(data);
} else {
ListNode newData = new ListNode(data);
ListNode curr = head;
for (int i=0; i< position; i++){
curr = curr.next;//一直往后遍历,找到要插入的位置,c/c++的 p=p->next;
}
//确保链表不会断裂丢失数据
newData.next = curr.next;//先将新加的结点指向后面,保证不断链
curr.next = newData;//把当前的点指向新加的点
}
size++;
}
private void deleteHead(int data) {//O(1)
head = head.next;
size--;
}
private void deleteNth(int data, int position) {//O(1)
if (position == 0){
deleteHead(data);
} else {
ListNode curr = head;
for (int i=0; i< position; i++){
curr = curr.next;
}
curr.next = curr.next.next;//curr.next 表示的是删除的点
}
size--;
}
public void find(int data){//O(n)
ListNode cur = head;
while(cur != null){//判断不是尾结点
if(cur.value == data) break;//找到后退出循环
cur = cur.next;//遍历下一个结点
}
}
/**
* 1、先判断链表中是否已存在该data,如果已存在则抛弃旧的值,然后在head插入新的值
* 2、如果不存在改data,则直接在head插入该data,保证head为最新访问的值
* 这里实现的是简单的lru,深层次的lru可使用哈希表+双向链表实现(可参考力扣的题目)
* @param data
*/
private void lru (int data) {
ListNode newData = new ListNode(data);
ListNode curr = head;
while (curr.next != null) {
if (curr.value == data){
//删除该结点
curr.next = curr.next.next;
break;
}
curr = curr.next;
}
//插入链表头部
head = newData.next;
}
读者可以先思考此问题的实现,该问题的求解过程小编会在另一篇博文解答,敬请期待!!