目录
1,什么是双向链表?
双向链表(double linked list)是在单链表的每个结点中,再设置一个指向其前驱结点的指针。所以在双向链表中的结点都有两个指针域:一个指向直接后继,一个指向直接前驱。这样在链表的任何一个节点,都可以访问到其前驱结点和后继节点。
2,双向链表的实现
2.1,双向链表的节点类型
class DoubleNode{
private int data;
public DoubleNode next;//下一个节点,默认为null
public DoubleNode pre;//前一个节点,默认是null
public DoubleNode(int data) {
this.data = data;
}
public int getData() {
return data;
}
@Override
public String toString() {
return "DoubleNode{" +
"data=" + data +
'}';
}
}
2.2,双向链表的实现
2.2.1,定义一个双向链表
class DoubleLinkedList{
//初始化一个头结点
private DoubleNode head=new DoubleNode(0);
public DoubleNode getDoubleNode() {
return head;
}
}
2.2.2,向双向链表的末尾插入一个元素
/**
* 向双向链表中添加元素,尾插法
* @param doubleNode 双向链表的一个节点
*/
public void add(DoubleNode doubleNode){
DoubleNode doubleNode1=this.head;
while (doubleNode1.next != null){
doubleNode1=doubleNode1.next;
}
// 退出循环,说明此时doubleNode1指针到双向链表的尾部
doubleNode1.next=doubleNode;
doubleNode.pre=doubleNode1;
}
2.2.3,向双向链表的头添加一个元素
/**
* 向双向链表中添加节点,头插法
* @param doubleNode 节点
*/
public void addHead(DoubleNode doubleNode){
DoubleNode doubleNode1=head.next;
if(doubleNode1 == null){
//说明此链表只有头结点的空链表
this.head.next=doubleNode;
doubleNode.pre=head;
}else {
head.next=doubleNode;
doubleNode.pre=head;
doubleNode.next=doubleNode1;
doubleNode1.pre=doubleNode;
}
}
2.2.4,根据索引向双向链表中任意一个位置插入一个元素
- 首先来看一下如何向双向链表中添加一个节点:
- 代码实现:
/**
* 根据索引向链双向链表中添加一个元素
* @param index 添加元素的位置,默认不算头结点
* @param doubleNode 需要插入链表的元素
* @return 添加成功返回true,否则返回false
*/
public boolean addOfIndex(int index ,DoubleNode doubleNode){
DoubleNode doubleNode1=head.next;
int k=0;
while (doubleNode1 !=null){
k++;
if(k == index)
break;
doubleNode1=doubleNode1.next;
}
if(k == index){
doubleNode1.pre.next=doubleNode;
doubleNode1.pre=doubleNode;
doubleNode.pre=doubleNode.pre;
doubleNode.next=doubleNode1;
return true;
}else {
System.out.println("输入位置不合法!");
return false;
}
}
2.2.5,根据元素值删除双向链表中的一个节点
- 先来看看如何在双向链表中删除一个节点:
- 代码实现:
/**
* 删除双向链表中的一个元素,根据值删除
* @param value 要删除的值
*/
public void deleteDoubleLinked(int value){
DoubleNode doubleNode=this.head.next;
if(doubleNode == null)
return;
while (doubleNode.getData() != value)
doubleNode = doubleNode.next;
if(doubleNode.next == null){
doubleNode.pre.next=null;
}else {
doubleNode.pre.next=doubleNode.next;
doubleNode.next.pre=doubleNode.pre;
}
}
2.2.6,遍历双向链表
/**
* 遍历双向链表
*/
public void printDoubleLinkedList(){
DoubleNode doubleNode=this.head.next;
while (doubleNode != null){
System.out.print(doubleNode.getData()+" ");
doubleNode=doubleNode.next;
}
}
3,测试代码
public class DoubleLinkedListDemo {
public static void main(String[] args) {
DoubleLinkedList doubleLinkedList=new DoubleLinkedList();
// 尾插法
doubleLinkedList.add(new DoubleNode(1));
doubleLinkedList.add(new DoubleNode(2));
doubleLinkedList.add(new DoubleNode(3));
doubleLinkedList.add(new DoubleNode(4));
doubleLinkedList.add(new DoubleNode(5));
// 头插法
// doubleLinkedList.addHead(new DoubleNode(1));
// doubleLinkedList.addHead(new DoubleNode(2));
// doubleLinkedList.addHead(new DoubleNode(3));
// doubleLinkedList.addHead(new DoubleNode(4));
// doubleLinkedList.addHead(new DoubleNode(5));
删除链表中的元素
doubleLinkedList.deleteDoubleLinked(5);
doubleLinkedList.deleteDoubleLinked(1);
doubleLinkedList.addOfIndex(5,new DoubleNode(199));
doubleLinkedList.printDoubleLinkedList();
}
}
- 结果展示