//结点类
public class ListNode {
public String strDate;
public ListNode prev;
public ListNode next;
public ListNode(String strDate) {
this.strDate = strDate;
this.next = null;
this.prev = null;
}
}
//链表实现类
public class FakeLinkListNode {
private ListNode fakeHead;
private ListNode last;
public FakeLinkListNode(){
this.fakeHead = new ListNode("0");
this.last = null;
}
//头插法
public void addFirst(String strDate) {
ListNode elem = new ListNode(strDate);
if(this.fakeHead.next == null) {
this.fakeHead.next = elem;
elem.prev = this.fakeHead;
this.last = elem;
return;
}
this.fakeHead.next.prev = elem;
elem.next = this.fakeHead.next;
this.fakeHead.next = elem;
elem.prev = this.fakeHead;
}
//尾插法
public void addLast(String strDate) {
ListNode elem = new ListNode(strDate);
if(this.fakeHead.next == null) {
this.fakeHead.next = elem;
elem.prev = this.fakeHead;
this.last = elem;
return;
}
elem.prev = this.last;
this.last.next = elem;
this.last = elem;
}
//任意位置插入,第一个数据节点为0号下标
public void addIndex(int index,String strDate) {
if(index < 0 || index > size()) {
System.out.println("INDEX NULL ERRPE");
return;
}
if(index == 0) {
addFirst(strDate);
return;
}
if(index == size()) {
addLast(strDate);
return;
}
ListNode find = findIndex(index);
ListNode elem = new ListNode(strDate);
elem.next = find.next;
find.next.prev = elem;
find.next = elem;
elem.prev = find;
}
private ListNode findIndex(int inedx) {
ListNode find = this.fakeHead.next;
int count = 0;
while (count < inedx - 1) {
find = find.next;
count ++;
}
return find;
}
//查找是否包含关键字key是否在单链表当中
public boolean contains(String key) {
ListNode find = this.fakeHead.next;
while (find != null) {
if(find.strDate.equals(key)) {
return true;
}
find = find.next;
}
return false;
}
//删除第一次出现关键字为key的节点
public void remove(String key) {
ListNode find = this.fakeHead.next;
while (find.next != null) {
if(find.strDate.equals(key)) {
find.prev.next = find.next;
find.next.prev = find.prev;
return;
}
find = find.next;
}
if(this.last.strDate.equals(key)) {
this.last = this.last.prev;
this.last.next = null;
return;
}
System.out.println("NO KEY");
}
//删除所有值为key的节点
public void removeAllKey(String key) {
ListNode find = this.fakeHead.next;
while (find.next != null) {
if(find.strDate.equals(key)) {
find.prev.next = find.next;
find.next.prev = find.prev;
}
find = find.next;
}
if(this.last.strDate.equals(key)) {
this.last = this.last.prev;
this.last.next = null;
}
}
//得到单链表的长度
public int size() {
ListNode find = this.fakeHead.next;
int count = 0;
while (find != null) {
count ++;
find = find.next;
}
return count;
}
public void display() {
ListNode find = this.fakeHead.next;
while (find != null) {
System.out.print(find.strDate + " ");
find = find.next;
}
System.out.println();
}
public void clear() {
this.fakeHead.next = null;
this.last = null;
}
}
//测试类
public class Test {
public static void main(String[] args) {
FakeLinkListNode linkListNode = new FakeLinkListNode();
linkListNode.addFirst("bbb");
linkListNode.addFirst("aaa");
linkListNode.addLast("ccc");
linkListNode.addLast("ddd");
linkListNode.addFirst("000");
linkListNode.addIndex(0, "eee");
linkListNode.addIndex(6, "ggg");
linkListNode.addIndex(8, "fff");
linkListNode.display();
System.out.println(linkListNode.size());
if (linkListNode.contains("000") && linkListNode.contains("ggg")) {
System.out.println("OK");
}
System.out.println("=========removeFirstKey==========");
linkListNode.display();
linkListNode.remove("eee");
linkListNode.remove("ggg");
linkListNode.remove("bbb");
linkListNode.remove("000");
linkListNode.display();
System.out.println("=========rremoveAllKey=========");
linkListNode.addFirst("000");
linkListNode.addFirst("000");
linkListNode.addLast("000");
linkListNode.addLast("000");
linkListNode.addIndex(3, "000");
linkListNode.addIndex(4, "000");
linkListNode.addIndex(6, "000");
linkListNode.display();
linkListNode.removeAllKey("000");
linkListNode.display();
System.out.println("======clear=======");
linkListNode.clear();
linkListNode.display();
}
}
运行结果:
INDEX NULL ERRPE
eee 000 aaa bbb ccc ddd ggg
7
OK
=========removeFirstKey==========
eee 000 aaa bbb ccc ddd ggg
aaa ccc ddd
=========rremoveAllKey=========
000 000 aaa 000 000 ccc 000 ddd 000 000
aaa ccc ddd
======clear=======
Process finished with exit code 0