数据结构-双链表的数据操作及特性

Posted 黑马程序员视频库

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构-双链表的数据操作及特性相关的知识,希望对你有一定的参考价值。

黑马程序员视频库

传智播客旗下互联网资讯、学习资源免费分享平台



概述

上一章中,我们已经入门了单链表的添加数据,删除数据及更新数据,但是在删除的时候,或者在更新的时候,它的效率不高因为,没一个节点只记录了它的下一个节点,这样一来,遍历节点就变得很慢,添加时,添加到指定的节点就变得效率低下。那么怎么解决呢?这一章,我们来看看双链表是如何操作的,以及如何遍历和快速的添加节点的。

双链表介绍

双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。

数据结构-双链表的数据操作及特性


定义节点及链表对象


/**

 * 双链表

 * @title DoubleLink.java

 * <p>description</p>

 * <p>company: www.itheima.com</p>

 * @author 三国的包子

 * @version 1.0

 *

 */public class DoubleLink {

    //节点对象

private class Node{

Object data;//当前节点的数据

}

private Node head;//头节点

private Node rear;//尾节点

}


从尾部添加节点到链接

分析

从尾部添加节点,首先在链表中,有一个head 指向头节点 有一个rear指向尾部节点,并且如果只有一个节点,这个节点既是头节点也是尾节点,如果有多个节点,那么根据节点的增加,尾部节点(rear)指向的节点不同。

添加的过程:

1.创建数据节点

2.将数据放入节点中

3.判断尾部节点是否为空,如果为空,说明链表还是空的,此时 新增节点即为头节点和尾节点

4.如果尾部节点不为空,链表存在,需要将新增的节点加入到列表中(即原尾部节点的后面),并移动rear 执行新增的节点。

编写添加的代码


/**

从尾部添加节点

@param data

*/

public void addFromRear(Object data){

// 1. 创建新的节点

Node node = new Node();

// 2. 把数据放入节点中

node.data = data;

// 3. 判断尾部节点是否为空 如果为空说明链表还是空的

if (rear == null) {

rear = node;

head = node;

else {

// 4. 判断如果尾部节点不为空,说明 链表是存在的

rear.next = node;

node.prev = rear;

//最后 将新增的节点 赋给尾节点引用

rear = node;

}

}


代码实现的过程如下

重写toString

分析

添加完成节点之后,需要遍历节点打印 查看链表的内容。所以这里我们重写toString方法。

重写toString ,需要在链表中从头节点开始遍历,遍历到尾部节点之后将每一个节点的数据连接起来。这里我们实现一个字符串连接。

实现

//[a,b,c]

@Override

public String toString() {

StringBuilder sbBuilder = new StringBuilder("[");

// 遍历链表中所有的数据

Node node = head;// 从头节点开始遍历数据

while (node != null) {

//如果node还没遍历到尾部节点

if (node != rear) {

//就有逗号

sbBuilder.append(node.data + ", ");

else {

sbBuilder.append(node.data);

}

// 条件的改变:将下一个节点赋值给当前node 引用。直到node.next=null 说明已经到尾部节点

node = node.next;

}

sbBuilder.append("]");

return sbBuilder.toString();

}



测试

package com.itheima.link;

public class TestDoubleLink {

public static void main(String[] args) {

DoubleLink doubleLink = new DoubleLink();

doubleLink.addFromRear("abc1");

doubleLink.addFromRear("abc2");

doubleLink.addFromRear("abc3");

System.out.println(doubleLink);

}

}

测试效果:

[abc1, abc2, abc3]


总结


通过添加节点,我们发现,双向链表是 有一个前驱和后继节点指针。这样就可以从任意的节点处添加节点了。只需要改变prev next 即可。下一章节,我们来讨论如何从中间位置添加节点以及从头部添加节点。这样大家就可以很好对比单链表了。今天先入门到这里。

(点击图片可查看)



▼点击 阅读原文 抢基础班免费名额

以上是关于数据结构-双链表的数据操作及特性的主要内容,如果未能解决你的问题,请参考以下文章

(王道408考研数据结构)第二章线性表-第三节2:双链表的定义及其操作(插入和删除)

有序的双链表的实现

链表都有哪些优点和缺点?

Day3:数据结构之带头双链表

JAVA 链表操作:单连表和双链表

数据结构-单链表的数据操作及特性