一、 MyLinkedList.java
public class MyLinkedList {
static class ListNode {
public int val;
public ListNode prev;//保存前驱
public ListNode next;//保存后继
public ListNode(int val) {
this.val = val;
}
}
public ListNode head;
public ListNode last;
//size,display,contains双链表与单链表一致
public int size() {
int len = 0;
ListNode cur = head;
while (cur != null) {
cur = cur.next;
len++;
}
return len;
}
public void display() {
ListNode cur = head;
while (cur != null) {
System.out.print(cur.val + " ");
cur = cur.next;
}
System.out.println();
}
//查找是否包含关键字key是否在链表当中
public boolean contains(int key) {
ListNode cur = head;
while (cur != null) {
if (cur.val == key) {
return true;
}
cur = cur.next;
}
return false;
}
//头插法
//先绑后面再绑前面
//特殊情况,一个链表也没有应该如何解决
public void addFirst(int data) {
ListNode node = new ListNode(data);
if (head == null) {
head = node;
last = node;//尾巴
return;
}
node.next = head;
head.prev = node;
head = node;
//另一种写法
/*if(head == null) {
head = node;
}else {
node.next = head;
head.prev = node;
head = node;
}*/
}
//尾插法
public void addLast(int data) {
ListNode node = new ListNode(data);
if (head == null) {
head = node;
last = node;
} else {
last.next = node;
node.prev = last;
last = node;
}
}
//任意位置插入,第一个数据节点为0号下标
public void addIndex(int index, int data) {
int size = size();
if (index < 0 || index > size) {
throw new IndexOutOfBounds("双向链表index不合法!");
}
if (index == 0) {
addFirst(data);
return;
}
if (index == size) {
addLast(data);
return;
}
ListNode cur = head;
while (index != 0) {
cur = cur.next;
index--;
}
ListNode node = new ListNode(data);
node.next = cur;
cur.prev.next = node;
node.prev = cur.prev;
cur.prev = node;
}
//删除第一次出现关键字为key的节点
//注意删除头和尾的情况
public void remove(int key) {
ListNode cur = head;
while (cur != null) {
if (cur.val == key) {
//开始删
if (cur == head) {
//删除头节点
head = head.next;
//只有1个节点的时候
if (head != null) {
head.prev = null;
} else {
last = null;
}
} else {
cur.prev.next = cur.next;
if (cur.next != null) {
//cur.prev.next = cur.next;
cur.next.prev = cur.prev;
} else {
//cur.prev.next = cur.next;
last = last.prev;
}
}
return;
} else {
cur = cur.next;
}
}
}
//删除所有值为key的节点
public void removeAllKey(int key) {
ListNode cur = head;
while (cur != null) {
if (cur.val == key) {
//开始删
if (cur == head) {
//删除头节点
head = head.next;
//只要1个节点的时候
if (head != null) {
head.prev = null;
} else {
last = null;
}
} else {
cur.prev.next = cur.next;
if (cur.next != null) {
//cur.prev.next = cur.next;
cur.next.prev = cur.prev;
} else {
//cur.prev.next = cur.next;
last = last.prev;
}
}
}
cur=cur.next;
}
}
public void clear(){
this.head=null;
this.last=null;
//上述方法太粗暴
}
public void clear(){
ListNode cur = head;
while (cur != null) {
ListNode curNext = cur.next;
cur.prev = null;
cur.next = null;
//cur.val = null;
cur = curNext;
}
head = null;
last = null;
}
}
二、IndexOutOfBounds.java
public class IndexOutOfBounds extends RuntimeException {
public IndexOutOfBounds() {
}
public IndexOutOfBounds(String s) {
}
}
三、Test.java
public class Test {
public static void main(String[] args) {
MyLinkedList mylist=new MyLinkedList();
mylist.addFirst(1);
mylist.addFirst(1);
mylist.addFirst(3);
mylist.display();
mylist.addLast(1);
mylist.addLast(15);
mylist.addLast(18);
mylist.display();
mylist.addIndex(1,3);
mylist.addIndex(5,36);
mylist.display();
mylist.remove(1);
mylist.display();
mylist.removeAllKey(1);
mylist.display();
mylist.clear();
mylist.display();
}
}