双向链表java简单实现增删改
比起单向链表,双向链表基于节点Node 类多了一个可以追溯上一个节点的引用pre,多了这个引用针对删除增加等这些操作,都比较方便,这里记录一下简单的java实现过程
package DataStrct.linklist;
/**
* @author luke
* @date 2021/4/1819:32
*/
public class DoubleLinkelistDemo {
public static void main(String[] args) {
System.out.println("--------------尾插");
DoubleLinklist doublelinklist = new DoubleLinklist(new Node(1, "第一"));
doublelinklist.add(new Node(2, "第二"));
doublelinklist.add(new Node(3, "第三"));
doublelinklist.add(new Node(4, "第四"));
doublelinklist.print_list();
System.out.println("--------------头插");
doublelinklist.headadd(new Node(7, "第七"));
doublelinklist.headadd(new Node(8, "第八"));
doublelinklist.headadd(new Node(9, "第九"));
doublelinklist.print_list();
System.out.println("--------------更新");
doublelinklist.update(new Node(9, "更新第九"));
doublelinklist.print_list();
System.out.println("--------------删除");
doublelinklist.del(9);
doublelinklist.print_list();
}
//节点类
static class Node {
int id;//节点id
String data;//节点属性
Node pre;//双向链表前一个节点
Node next;//双向链表的下一个节点
public Node(int id, String data) {
this.id = id;
this.data = data;
}
@Override
public String toString() {
return "Node{" +
"id=" + id +
", data='" + data + '\'' +
'}';
}
}
//双向链表
static class DoubleLinklist {
Node head;
Node tail;
public DoubleLinklist(Node head) {
this.head = head;
this.tail = head;
}
/**
* 1.添加节点add(尾插+头插)
* 2.修改节点update
* 3.删除节点del
* 4.打印链表print
*/
/**
* 尾插
*
* @param node
*/
public void add(Node node) {
/**
* 默认添加是重链表最后添加的
*/
if (tail == null) {
//当链表为空时
head = node;
tail = node;
return;
}
//将插入节点赋值给tail节点---tail节点的下个节点指向插入节点,插入节点的上个节点指向tail节点的上个节点
tail.next = node;
node.pre = tail;
tail = node;//更新链表的尾部节点
}
/**
* 头插
*
* @param node
*/
public void headadd(Node node) {
if (head == null) {
//当链表为空时
head = node;
tail = node;
return;
}
head.pre = node;
node.next = head;
head = node;
}
/**
* 更新
*
* @param node
*/
public void update(Node node) {
Node temp = head;
//遍历链表
while (true) {
if (temp.next == null) {
//达到最后一个节点了
break;
}
if (temp.id == node.id) {
break;
}
temp = temp.next;
}
temp.data = node.data;
}
/**
* 删除
*
* @param id
*/
public void del(int id) {
//更具id进行删除
Node temp = head;
//如果是空表直接返回
if (head == null) {
System.out.println("当前为空链表");
return;
}
while (true) {
if (temp.next == null) {
break;//遍历到最后了
}
if (temp.id == id) {
break;
}
temp = temp.next;
}
//删除操作,
// 当前节点的上个节点的下个节点指向当前节点的下个节点
// 当前节点的下个节点的上个节点指向当前节点的上个节点
//当删除节点是头节点或者尾节点时需要特殊处理
if (temp.id == head.id) {
head=head.next;
head.pre=null;
}
else if (temp.id == tail.id) {
tail = tail.pre;
tail.next = null;
}
else {
temp.pre.next=temp.next;
temp.next.pre=temp.pre;
}
}
/**
* 打印链表
*/
public void print_list() {
//遍历链表
Node tempnode = head;
while (true) {
if (tempnode.next == null) {
break;
}
System.out.println(tempnode);
tempnode = tempnode.next;
}
}
}
}