一、双向链表 (不带头)
无头双向链表:在Java的集合框架库中LinkedList底层实现就是无头双向循环链表
- 双向链表 和 单向链表的区别,就在于 双向 比 单向 多个 一个前驱地址。而且 你会发现 正因为有了前驱地址,所以所以这个链表,它有两种走向,这也是这个链表为什么叫做双向链表的原因之一
首先看看单链表是如何删除节点的
总结:
单向链表在删除一个节点的时候,需要借助前驱节点,才能删除。
双向链表是如何删除节点的
双向链表删除节点,不需要借助前驱节点
因为双向链表,它存储前驱和后驱的节点的地址,它都知道。
另外双向链表会多一个引用last,这个引用永远指向此时链表的尾巴节点
head就是永远指向双向链表的头节点。
二、模拟实现双向链表
2.1、实现一个类,来表示双向链表的节点
class ListNode{
//存储int类型的数据
public int val;
//存储上一个节点的地址
public ListNode prev;
//存储下一个节点的地址
public ListNode next;
public ListNode(int val){
//构造方法
this.val = val;
}
}
2.2、实现一个类,来表示双向链表
public class MyLinkedList {
//指向双向链表的头结点
public ListNode head;
//指向双向链表的尾巴节点
public ListNode last;
//头插法
public void addFirst(int data){
};
//尾插法
public void addLast(int data){
};
//任意位置插入,第一个数据节点为0号下标
public boolean addIndex(int index,int data){
return true;
};
//查找是否包含关键字key是否在单链表当中
public boolean contains(int key){
return true;
};
//删除第一次出现关键字为key的节点
public void remove(int key){
};
//删除所有值为key的节点
public void removeAllKey(int key){
};
//得到单链表的长度
public int size(){
return 0;
};
public void display(){
};
public void clear(){
};
}
实现LinkedList中的所有方法
通过这些方法就可以操作链表
打印链表
//打印链表
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是否在单链表当中
//查找是否包含关键字key是否在单链表当中
//找到返回true,找不到返回false
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<