class ListNode{
public int val;
public ListNode prev;
public ListNode next;
public ListNode(int val){ //构造方法和类名是一样的,只对val初始化,因为当又一个节点的时候,不知道前一个后一个是谁
this.val = val;
}
}
public class MyDoubleList {
public ListNode head; //ListNode--是个类型 //head--指向头节点
public ListNode last; //last--指向尾巴节点
//一、打印双向链表
public void display(){
ListNode cur = this.head;
while (cur != null){
System.out.print(cur.val+" ");
cur = cur.next;
}
System.out.println( );
}
//二、得到双链表的长度
public int size(){
ListNode cur = this.head;
int count = 0;
while (cur != null){
count++;
cur = cur.next;
}
return count;
}
//三、查找双链表是否包含关键字key
public boolean contains(int key){
ListNode cur = this.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){
this.head = node;
this.last = node;
}else {
node.next = this.head;
this.head.prev = node;
this.head = node;
}
}
//五、尾插法
public void addLast(int data){
ListNode node = new ListNode(data);
if (head == null){
this.head = node;
this.last = node;
}else {
last.next = node;
node.prev = last;
this.last = node;
}
}
//六、删除第一次出现关键字为key的节点
public void remove(int key) {
ListNode cur = this.head;
while (cur != null) {
if (cur.val == key) {
if (cur == head) {
head = head.next;
if (head.next != null){ //考虑到一个节点的情况
head.prev = null;
}else { //head==null
last = null;
}
} else {
cur.prev.next = cur.next;
if (cur.next != null) { //说明cur在中间位置
cur.next.prev = cur.prev;
} else {
last = last.prev;
}
}
return;
}
cur = cur.next;
}
}
//七、删除所有值为key的节点
public void removeAllKey(int key){
ListNode cur = this.head;
while (cur != null) {
if (cur.val == key) {
if (cur == head) {
head = head.next;
if (head != null){ //考虑到一个节点的情况
head.prev = null;
}else { //head==null
last = null;
}
} else {
cur.prev.next = cur.next;
if (cur.next != null) { //说明cur在中间位置
cur.next.prev = cur.prev;
} else {
last = last.prev;
}
}
}
cur = cur.next;
}
}
public ListNode searchIndex(int index){
ListNode cur = this.head;
while (index != 0){
cur = cur.next;
index--;
}
return cur;
}
//八、任意位置插入,第一个数据节点为0号下标
public void addIndex(int index,int data){
ListNode node = new ListNode(data);
if (index < 0 || index > size()){
System.out.println("index位置不合法");
return;
}
if (index == 0){
addFirst(data);
return;
}
if ((index == size())){
addLast(data);
return;
}
ListNode cur = searchIndex(index);
node.next = cur.prev.next;
cur.prev.next = node;
node.prev = cur.prev;
cur.prev = node;
}
//九、清空双链表
public void clear(){
while (head != null){
ListNode curNext = head.next;
head.next = null;
head.prev = null;
head = curNext;
}
last = null;
}
}