创建空的成员变量并用构造函数初始化
class ListNode {
public int data;
public ListNode next;//节点引用
public ListNode prev;//节点前驱
public ListNode(int data) {
this.data = data;
}
}
头节点和尾结点
public class DoubleLinkedList {
public ListNode head;
public ListNode tail;
头插法
//头插法
public void addFirst(int data) {
ListNode node = new ListNode(data);
if (this.head == null) {
this.head = node;
this.tail = node;
} else {
node.next = this.head;
this.head.prev = node;
this.head = node;
}
}
头插法的过程如代码和图所示,分为如果链表还没有头节点和以及有头节点,插入顺序不再赘述。
尾插法
//尾插法
public void addLast(int data) {
ListNode node = new ListNode(data);
if (this.head == null) {
this.tail = node;
this.head = node;
} else {
this.tail.next = node;
node.prev = this.tail;
this.tail = node;
}
}
打印链表
//打印链表
public void display() {
ListNode cur = this.head;
while (cur != null) {
System.out.print(cur.data + " ");
cur = cur.next;
}
System.out.println();
}
任意位置插入,第一个数据节点为0的下标
计算链表长度
//任意位置插入,第一个数据节点为0的下标
public void addIndex (int index,int data) {
if (index < 0 || index > size()) {
return;
}
if (index == 0) {
addFirst(data);
return;
}
if (index == size()) {
addLast(data);
return;
}
ListNode cur = searchIndex(index);
ListNode node = new ListNode(data);
node.next = cur;
node.prev = cur.prev;
cur.prev.next = node;
cur.prev = node;
}
public ListNode searchIndex(int index) {
ListNode cur = this.head;
while (index > 0) {
cur = cur.next;
index --;
}
return cur;
}
//求链表长度
public int size() {
ListNode cur = this.head;
int count = 0;
while (cur != null) {
cur = cur.next;
count++;
}
return count;
}
删除第一次出现关键字为key的点
//删除第一次出现关键字为key的点
public void remove(int key) {
ListNode cur = this.head;
while (cur != null) {
if (cur.data == key) {
//删除的是否为头节点
if (cur == this.head) {
this.head = this.head.next;
this.head.prev = null;
} else {
cur.prev.next = cur.next;
if (cur.next != null) {
//删除的不是尾结点
cur.next.prev = cur.prev;
} else {
this.tail = cur.prev;
}
}
//删除完成
return;
} else {
cur = cur.next;
}
}
}
删除所有key节点
public void removeAllkey (int key) {
ListNode cur = this.head;
while (cur != null) {
if (cur.data == key) {
//删除的是否为头节点
if (cur == this.head) {
this.head = this.head.next;
this.head.prev = null;
} else {
cur.prev.next = cur.next;
if (cur.next != null) {
//删除的不是尾结点
cur.next.prev = cur.prev;
} else {
this.tail = cur.prev;
}
}
}
cur = cur.next;
}
}
清空链表
//清空回收链表
public void clear() {
ListNode cur = this.head;
ListNode curNext;
while (cur != null) {
curNext = cur.next;
cur.next = null;
cur.prev = null;
cur = curNext;
}
this.head = null;
this.tail = null;
}
查找是否含有关键字key
//查找是否包含关键字key
public boolean contains (int key) {
if (head == null) {
return false;
}
ListNode cur = this.head;
while (cur != null) {
if (cur.data == key) {
return true;
}
cur = cur.next;
}
return false;
}
}
测试代码
public class Test {
public static void main(String[] args) {
DoubleLinkedList doubleLinkedList = new DoubleLinkedList();
doubleLinkedList.addFirst(3);
doubleLinkedList.addFirst(3);
doubleLinkedList.addFirst(3);
doubleLinkedList.addLast(4);
doubleLinkedList.addLast(5);
doubleLinkedList.addLast(3);
//3 2 1 4 5 6
doubleLinkedList.display();
doubleLinkedList.addIndex(3,999);
//3 2 1 999 4 5 6
doubleLinkedList.display();
doubleLinkedList.remove(5);
doubleLinkedList.display();
System.out.println(doubleLinkedList.contains(9));
doubleLinkedList.removeAllkey(3);
doubleLinkedList.display();
doubleLinkedList.clear();
System.out.println("dadedsffw");
}
}
完整代码
import java.util.List;
/**
* @Author 袁媛
* @Date 2020/7/31
* @Time 10:54
*/
class ListNode {
public int data;
public ListNode next;
public ListNode prev;
public ListNode(int data) {
this.data = data;
}
}
public class DoubleLinkedList {
public ListNode head;
public ListNode tail;
//头插法
public void addFirst(int data) {
ListNode node = new ListNode(data);
if (this.head == null) {
this.head = node;
this.tail = node;
} else {
node.next = this.head;
this.head.prev = node;
this.head = node;
}
}
//尾插法
public void addLast(int data) {
ListNode node = new ListNode(data);
if (this.head == null) {
this.tail = node;
this.head = node;
} else {
this.tail.next = node;
node.prev = this.tail;
this.tail = node;
}
}
//打印链表
public void display() {
ListNode cur = this.head;
while (cur != null) {
System.out.print(cur.data + " ");
cur = cur.next;
}
System.out.println();
}
//任意位置插入,第一个数据节点为0的下标
public void addIndex (int index,int data) {
if (index < 0 || index > size()) {
return;
}
if (index == 0) {
addFirst(data);
return;
}
if (index == size()) {
addLast(data);
return;
}
ListNode cur = searchIndex(index);
ListNode node = new ListNode(data);
node.next = cur;
node.prev = cur.prev;
cur.prev.next = node;
cur.prev = node;
}
public ListNode searchIndex(int index) {
ListNode cur = this.head;
while (index > 0) {
cur = cur.next;
index --;
}
return cur;
}
//求链表长度
public int size() {
ListNode cur = this.head;
int count = 0;
while (cur != null) {
cur = cur.next;
count++;
}
return count;
}
//删除第一次出现关键字为key的点
public void remove(int key) {
ListNode cur = this.head;
while (cur != null) {
if (cur.data == key) {
//删除的是否为头节点
if (cur == this.head) {
this.head = this.head.next;
this.head.prev = null;
} else {
cur.prev.next = cur.next;
if (cur.next != null) {
//删除的不是尾结点
cur.next.prev = cur.prev;
} else {
this.tail = cur.prev;
}
}
//删除完成
return;
} else {
cur = cur.next;
}
}
}
//删除所有key节点
public void removeAllkey (int key) {
ListNode cur = this.head;
while (cur != null) {
if (cur.data == key) {
//删除的是否为头节点
if (cur == this.head) {
this.head = this.head.next;
this.head.prev = null;
} else {
cur.prev.next = cur.next;
if (cur.next != null) {
//删除的不是尾结点
cur.next.prev = cur.prev;
} else {
this.tail = cur.prev;
}
}
}
cur = cur.next;
}
}
//清空回收链表
public void clear() {
ListNode cur = this.head;
ListNode curNext;
while (cur != null) {
curNext = cur.next;
cur.next = null;
cur.prev = null;
cur = curNext;
}
this.head = null;
this.tail = null;
}
//查找是否包含关键字key
public boolean contains (int key) {
if (head == null) {
return false;
}
ListNode cur = this.head;
while (cur != null) {
if (cur.data == key) {
return true;
}
cur = cur.next;
}
return false;
}
}