愿所有梦想都被温柔以待
双向链表和单向链表是两种不同的数据结构。主要区别在于一个节点指向其前驱节点和后继节点的方式不同。
单向链表
在单向链表中,每个节点只有指向下一个节点的指针。这意味着可以从头节点开始遍历整个列表,但不能反向遍历。因此,在单向链表中,访问一个节点的前驱节点需要遍历整个链表直到找到它。
由于单向链表只需要一个指针来指向下一个节点,所以它的空间使用效率比双向链表更高。此外,由于单向链表不能反向遍历,因此在某些情况下可能更快。例如,当你只需要按照顺序访问链表时,单向链表可能更加合适。
单向链表适合以下场景:
- 需要频繁进行元素的**和删除操作,比如lru缓存算法;
- 内存空间较小,并且在运行过程中链表的长度不会超过预设值的情况下,可以使用单向链表优化程序性能;
- 对顺序访问没有要求。
双向链表
与单向链表不同,每个节点在双向链表中都有指向前驱节点和后继节点的指针,这使得能够以任何方向遍历整个列表。这也意味着访问一个节点的前驱节点或后继节点的时间复杂度是o(1)级别的。
然而,由于每个节点需要同时存储指向前驱节点和后继节点的指针,所以相对于单向链表,双向链表占用的空间会更大。此外,由于每个节点都有指向前驱节点和后继节点的指针,因此在某些情况下访问链表可能会变得更慢。例如,当你经常需要在链表中**或删除节点时,双向链表可能变得更好。
双向链表适合以下场景:
- 需要经常对链表进行反向遍历;
- 需要在链表中查找某个元素前面和后面的元素,或者需要在链表中进行元素的**、删除操作;
- 通过双向链表可以实现多个迭代器同时遍历链表的操作。
实例代码如下,单项链表演示已经有过发文,可在本人账号内容下查看
package com.success.day04;
public class DoubleLinkedListDemo {
public static void main(String[] args) {
HeroNode heroNode1 = new HeroNode(1, "宋江", "及时雨");
HeroNode heroNode2 = new HeroNode(2, "卢俊义", "玉麒麟");
HeroNode heroNode3 = new HeroNode(3, "吴用", "智多星");
DoubleLinkedList list = new DoubleLinkedList();
list.add(heroNode1);
list.add(heroNode2);
System.out.println("=========================原数据==========================");
list.list();
System.out.println("========================添加数据后==========================");
list.add(heroNode3);
list.list();
}
}
/**
* @Description 创建一个双向列表
*/
class DoubleLinkedList {
//先初始化一个头节点,头节点不要动,不存放具体的数据
private HeroNode head = new HeroNode(0, "", "");
/**
* @return {@link HeroNode }
* @Description 获取头节点
*/
public HeroNode getHead() {
return head;
}
/**
* @Description 列表遍历,获取列表数据
*/
public void list() {
//判断列表数据是否为空
if (head.next == null) {
System.out.println("对不起,列表数据为空");
return;
}
//创建辅助变量
HeroNode temp = head.next;
while (true) {
//判断是不是到了链表最后
if (temp == null) {
break;
}
//输出节点信息
System.out.println(temp);
//将temp后移
temp = temp.next;
}
}
/**
* @param heroNode
* @Description 添加节点(直接添加到最后)
*/
public void add(HeroNode heroNode) {
//创建临时变量
HeroNode temp = head;
//遍历链表,到达最后
while (true) {
//找到链表的最后
if (temp.next == null) {
break;
}
//如果没有找到,就将temp后移
temp = temp.next;
}
//数据加入
temp.next = heroNode;
// heroNode.pre = temp;
}
/**
* @param newHero
* @Description 更新节点数据
*/
public void update(HeroNode newHero) {
//定义临时节点
HeroNode temp = head;
//判断链表是否为空
if (temp.next == null) {
System.out.println("链表为空");
return;
}
//定义是找到了需要修改的节点,默认为 false
temp = head.next;
boolean flag = false;
while (true) {
//已经遍历完毕
if (temp == null) {
break;
}
//找到
if (temp.userId == newHero.userId) {
flag = true;
break;
}
temp = temp.next;
}
//数据更新
if (flag) {
temp.userName = newHero.userName;
temp.nickName = newHero.nickName;
} else {
System.out.println("所查找数据为空");
}
}
/**
* @param userId
* @Description 删除数据
*/
public void del(int userId) {
//判断当前链表是否为空
if (head.next == null) {
System.out.println("链表为空");
return;
}
//标志是否找到了那个待删除的节点
boolean flag = false;
//定义临时变量
HeroNode temp = head.next;
while (true) {
//已经到链表的最后
if (temp == null) {
break;
}
if (temp.userId == userId) {
flag = true;
break;
}
temp = temp.next;
}
if (flag) {
temp.pre.next = temp.next;
//如果是最后一个节点,就不需要执行下面这句话,否则出现空指针
if (temp.next != null) {
temp.next.pre = temp.pre;
}
} else {
System.out.println("要删除的数据为空");
}
}
}
class HeroNode {
//编号
public int userId;
//姓名
public String userName;
//绰号
public String nickName;
//指向下一个节点
public HeroNode next;
//指向上一个节点
public HeroNode pre;
public HeroNode() {
}
/**
* @param userId id
* @param userName 姓名
* @param nickName 绰号
* @return
* @Description 英雄节点
*/
public HeroNode(int userId, String userName, String nickName) {
this.userId = userId;
this.userName = userName;
this.nickName = nickName;
}
public int getUserId() {
return userId;
}
public void setUserId(int userId) {
this.userId = userId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getNickName() {
return nickName;
}
public void setNickName(String nickName) {
this.nickName = nickName;
}
@Override
public String toString() {
return "HeroNode{" + "userId=" + userId + ", userName='" + userName + '\'' + ", nickName='" + nickName + '\'' + '}';
}
}
愿你在生命的旅程中,收获无数珍贵的财富:健康、信念、爱、友谊和成功!愿你永远充满希望和喜悦,每一天都是阳光灿烂的。愿你勇敢地面对人生的挑战和变数,并且时刻保持乐观、坚强的心态。祝福你幸福快乐、美好无限!