双向链表java简单实现增删改
Posted 大树的困惑
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了双向链表java简单实现增删改相关的知识,希望对你有一定的参考价值。
双向链表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;
以上是关于双向链表java简单实现增删改的主要内容,如果未能解决你的问题,请参考以下文章