手写双链表。直接上代码
public class DoubleLinkedList {
private static class ListNode{
int val;
ListNode prev;
ListNode next;
public ListNode(int val){
this.val = val;
}
}
// 头节点
public ListNode head;
// 尾节点
public ListNode tail;
//头插法
public void addFirst(int data){
ListNode node = new ListNode(data);
if (head==null){
head = node;
tail = node;
}else{
head.prev = node;
node.next = head;
head = node;
}
}
//尾插法
public void addLast(int data){
ListNode node = new ListNode(data);
if (head==null){
head = node;
tail = node;
}else{
tail.next = node;
node.prev = tail;
tail = node;
}
}
//任意位置插入,第一个数据节点为0号下标
public void addIndex(int index, int data){
// 校验index 是否合法
checkRangeForAdd(index);
ListNode node = new ListNode(data);
if (index==0){
addFirst(data);
}
if (index==size()){
addLast(data);
}
// 找到要插入位置的节点
ListNode tempNode = findNodeByIndex(index);
tempNode.prev.next = node;
node.next = tempNode;
node.prev = tempNode.prev;
tempNode.prev = node;
}
//查找是否包含关键字key是否在单链表当中
public boolean contains(int key){
ListNode current = head;
while(current!=null){
if (current.val==key){
return true;
}
current = current.next;
}
return false;
}
private ListNode findNodeByIndex(int index) {
ListNode current = head;
while(index>0){
current = current.next;
index--;
}
return current;
}
private void checkRangeForAdd(int index) {
if (index<0||index>size()){
throw new IndexOutOfBoundsException("下标不正确"+index);
}
}
//删除第一次出现关键字为key的节点
public void remove(int key){
if(head==null){
return ;
}
ListNode current = head;
while (current!=null){
//头节点
if (current.val==key){
if (current==head) {
head = head.next;
//删除头节点
if (head == null) {
tail = null;
} else {
//只剩一个节点
// head.prev.next = null;
head.prev = null;
}
}else if(current==tail){
//处理尾节点
tail = tail.prev;
tail.next = null;
}
else{
current.prev.next = current.next;
current.next.prev = current.prev;
}
return ;
}
current = current.next;
}
}
//得到单链表的长度
public int size(){
int count = 0;
ListNode current = head;
while(current!=null){
count++;
current = current.next;
}
return count;
}
//删除所有值为key的节点
public void removeAllKey(int key){
if(head==null){
return ;
}
ListNode current = head;
while (current!=null){
//头节点
if (current.val==key){
if (current==head) {
head = head.next;
//删除头节点
if (head == null) {
tail = null;
} else {
//只剩一个节点
// head.prev.next = null;
head.prev = null;
}
}else if(current==tail){
//处理尾节点
tail = tail.prev;
tail.next = null;
}
else{
current.prev.next = current.next;
current.next.prev = current.prev;
}
}
current = current.next;
}
}
//打印
public void display(){
StringBuffer sb = new StringBuffer();
sb.append("[");
ListNode current = head;
while(current!=null){
if (current.next==null){
sb.append(current.val);
}else sb.append(current.val+",");
current = current.next;
}
sb.append("]");
System.out.println(sb.toString());
}
public void clear() {
head = null;
tail = null;
}
}