java 双向链表结构_Java 数据结构 双向链表

Java 数据结构 双向链表

基本特点

单向链表:只有指向下一个结点的引用(后驱)

双向链表:既有指向下一个结点的引用(后驱),也有指向上一个结点的引用(前驱)

优点

双向链表在查找元素的时候,速度比之单向链表会更快

拥有前驱后驱,操作更灵活

缺点

增加删除结点操作更繁琐一些

占用的资源更多,数据存储率相比单向链表更低(生产中使用单链表比双链表更多)

存储结构

fc9bd00f5fdd

在这里插入图片描述

Java代码

package linklist;

/**

* 双向链表

* Created by Sheldon on 2019/4/1.

* Project Name: alstudy.

* Package Name: linklist.

*/

// 单向链表

class NodeTwo{

Data data;

NodeTwo pre;

NodeTwo next;

}

public class LinkListTwo {

// 头结点

NodeTwo head = null;

/**

* 追加结点

* @param data

* @return

*/

public boolean addNode(Data data){

NodeTwo temp = head;

NodeTwo newNode;

// 创建新结点对象

if ((newNode=new NodeTwo())==null){

System.out.println("申请内存失败!");

}else {

// 保存数据

newNode.data = data;

if (head==null){

head = newNode;

return true;

}

// 遍历数组,追加数据

while (temp.next!=null){

temp = temp.next;

}

// 通过遍历找到最后一个元素,使其后驱指向新结点

temp.next = newNode;

// 将新结点的前驱指向‘最后一个元素’

newNode.pre = temp;

return true;

}

return false;

}

/**

* 查找结点

* @param key

*/

public void findByKey(String key){

NodeTwo temp = head;

// 遍历结点

while (temp!=null){

if (temp.data.key.equals(key)){

// 打印结点信息

System.out.println(temp.data.key+"->"+temp.data.name);

return;

}

temp = temp.next;

}

System.out.println("没有该结点");

}

/**

* 删除结点

* @param key

* @return

*/

public boolean delNode(String key){

NodeTwo temp = head;

while (temp!=null){

if (temp.data.key.equals(key)){

// 查看该结点是否是头结点

if (temp==head){

// 如果是头结点,将其引用替换成它的后驱

head = temp.next;

head.pre = null;

return true;

}else {

// 将该结点的前驱的‘后驱引用’指向它的后驱

// 直接temp = temp.next是无法得到想要的结果的,因为其前驱没发生变化

temp.pre.next = temp.next;

return true;

}

}

temp = temp.next;

}

return false;

}

/**

* 显示所有结点

*/

public void showAllList(){

NodeTwo temp = head;

while (temp!=null){

// 打印结点信息

System.out.printf(temp.data.key+"->"+temp.data.name+" ");

temp = temp.next;

}

System.out.println();

}

public static void main(String[] args) {

LinkListTwo list = new LinkListTwo();

// 插入结点

list.addNode(new Data("1","小明"));

list.addNode(new Data("2","小红"));

list.addNode(new Data("3","小绿"));

list.addNode(new Data("4","小黄"));

// 查看结点效果

list.showAllList();

// 查找结点

list.findByKey("1");

// 删除结点

list.delNode("2");

// 再次查看结点

list.showAllList();

}

}

显示结果:

fc9bd00f5fdd

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
双向链表是一种常见的数据结构,与单向链表相比,它可以在节点之间进行双向遍历。在Java,我们可以使用类来实现双向链表。 下面是一个简单的Java程序,演示如何创建和输出双向链表: ```java // 双向链表节点类 class Node { public int data; public Node prev; public Node next; public Node(int data) { this.data = data; this.prev = null; this.next = null; } } // 双向链表类 class DoubleLinkedList { public Node head; public Node tail; public DoubleLinkedList() { this.head = null; this.tail = null; } // 在链表头部插入节点 public void insertAtHead(int data) { Node newNode = new Node(data); if (head == null) { head = newNode; tail = newNode; return; } newNode.next = head; head.prev = newNode; head = newNode; } // 在链表尾部插入节点 public void insertAtTail(int data) { Node newNode = new Node(data); if (tail == null) { head = newNode; tail = newNode; return; } newNode.prev = tail; tail.next = newNode; tail = newNode; } // 输出链表 public void printList() { Node current = head; while (current != null) { System.out.print(current.data + " "); current = current.next; } System.out.println(); } } // 测试类 public class Main { public static void main(String[] args) { DoubleLinkedList list = new DoubleLinkedList(); list.insertAtHead(1); list.insertAtHead(2); list.insertAtTail(3); list.insertAtTail(4); list.printList(); // 输出:2 1 3 4 } } ``` 在上面的程序,我们首先定义了一个`Node`类来表示双向链表的每个节点,其包含了当前节点的值、前一个节点和后一个节点。接着,我们定义了`DoubleLinkedList`类来表示整个双向链表,其包含了头节点和尾节点。 在`DoubleLinkedList`类,我们定义了`insertAtHead`和`insertAtTail`方法来在链表头部和尾部插入节点,分别需要创建一个新节点,并将它与当前链表的头节点或尾节点进行连接。 最后,我们定义了`printList`方法来输出整个链表,只需要从链表的头节点开始遍历,依次输出每个节点的值即可。 在`Main`类,我们通过`DoubleLinkedList`类创建了一个双向链表,并向其插入了四个节点。最后,我们调用`printList`方法输出整个链表。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值