一、LinkList实现链表
package yang.study.com.appcompletetextviewdemo;
public class LinkList<T> {
Node head;
int size;
public void put(T data) {
if (head == null) {
head = new Node(data);
} else {
Node newHead = new Node(data);
newHead.next = head;
head = newHead;
}
size++;
}
public void putLast(T data) {
Node node = new Node(data);
head.next = node;
}
public void put(int index, T data) {
if (index < 0 || index > size) {
throw new IndexOutOfBoundsException("数组越界异常");
}
if (index == 0) {
put(data);
}
if (index == size) {
putLast(data);
}
Node indexNode = head;
Node tempNode = head;
for (int i = 1; i < index; i++) {
indexNode = tempNode;
tempNode = tempNode.next;
}
Node node = new Node(data);
node.next = indexNode.next;
indexNode.next = node;
size++;
}
public T remove() {
if (head != null) {
Node deleteNode;
deleteNode = head;
head = head.next;
size--;
return deleteNode.data;
}
return null;
}
public T removeLast() {
if (head != null) {
Node tempHead = head;
Node deleteNode = head;
while (deleteNode.next != null) {
tempHead = deleteNode;
deleteNode = deleteNode.next;
}
tempHead.next = null;
size--;
return deleteNode.data;
}
return null;
}
public T remove(int index) {
if (head != null) {
if (index < 0 || index > size) {
throw new IndexOutOfBoundsException("数组越界异常");
}
if (index == 0) {
remove();
}
if (index == size) {
removeLast();
}
Node indexNode = head;
Node tempNode = head;
for (int i = 0; i < index; i++) {
indexNode = tempNode;
tempNode = tempNode.next;
}
Node deleteNode = indexNode.next;
indexNode.next = deleteNode.next;
deleteNode.next = null;
size--;
return deleteNode.data;
}
return null;
}
public void modify(int index, T data) {
if (index < 0 || index > size) {
throw new IndexOutOfBoundsException("数组越界异常");
}
Node modifyNode = head;
for (int i = 0; i < index; i++) {
modifyNode = modifyNode.next;
}
modifyNode.data = data;
}
public T get() {
if (head != null) {
return head.data;
}
return null;
}
public T get(int index) {
if (index < 0 || index > size) {
throw new IndexOutOfBoundsException("数组越界异常");
}
if (head != null) {
Node tempNode = head;
for (int i = 0; i < index; i++) {
tempNode = head.next;
}
return tempNode.data;
}
return null;
}
@Override
public String toString() {
Node tempNode = head;
while (tempNode != null) {
System.out.print(tempNode.data + " ");
tempNode = tempNode.next;
}
System.out.println();
return super.toString();
}
class Node {
T data;
Node next;
public Node(T data) {
this.data = data;
}
}
}
二、LruLinkList实现链表
结合LRU算法实现链表
package yang.study.com.appcompletetextviewdemo;
public class LruLinkList<T> extends LinkList<T> {
private static int DEFAULT_SIZE = 5;
private int listSize = DEFAULT_SIZE;
private LinkList<T> linkList = new LinkList<>();
public LruLinkList() {
this(DEFAULT_SIZE);
}
public LruLinkList(int listSize) {
this.listSize = listSize;
}
@Override
public void put(T data) {
super.put(data);
if (size > listSize) {
removeLast();
}
}
@Override
public void put(int index, T data) {
super.put(index, data);
if (size > listSize) {
removeLast();
}
}
@Override
public T get(int index) {
if (index < 0 || index > size) {
throw new IndexOutOfBoundsException("数组越界异常");
}
Node preNode = head;
Node tempNode = head;
if (head != null) {
for (int i = 0; i < index; i++) {
preNode = tempNode;
tempNode = tempNode.next;
}
preNode.next = tempNode.next;
head.toString();
tempNode.next = head;
head = tempNode;
}
return tempNode.data;
}
}