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

Posted 黑马程序员视频库

tags:

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

黑马程序员视频库

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


概述

上一章中,我们已经入门了单链表的添加数据以及查询数据打印了,那么当我们存储了数据,要删除的时候怎么办呢?这章,我们来看看如何删除数据。

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

根据数据删除节点

分析

根据数据删除节点

  1. 首先:删除数据分三种情况,1.删除的节点是头节点 2.删除的节点为尾节点 3.删除的节点是中间节点

  2. 其次:需要获取要删除的数据所对应的节点以及他的前一个节点

  3. 删除节点,需要将链表的长度扣减 增加节点需要长度增加。


实现

修改增加方法,增加长度属性

 private transient int size = 0;// 单列表的长度

/**

从尾部添加一个节点

*

@param data

*            要添加的节点的数据

*/

public void add(Object data) {

// 1.构建一个节点对象

Node node = new Node(data);

if (head == null) {

// 2.判断链表中是否为空 如果为空 则新增的节点变成头节点

head = node;

else {

// 3.如果链表不为空,则需要查询到尾部节点

Node rear = findRearNode();

// 4.向尾部节点添加一个节点

rear.next = node;// rear肯定不为空

}

size++;

}

// 获取链表的长度

public int size() {

return size;

}

编写删除的代码

 // 删除链表中的数据

public void removeObject(Object data) {

// 赋值为临时对象

Node temp = head;

//记录要删除的节点的前一个节点

Node prev = temp;

if (data != null)

while (temp != null) {

if (data.equals(temp.data) && temp.data.hashCode()==data.hashCode()) {

//如果删除的是头节点

if(temp==head){

head=temp.next;//

//如果删除的是尾部节点

}else if(temp.next==null){

prev.next=null;

//如果删除的是中间节点

}else{

prev.next=temp.next;

}

size--;

break;

}

prev=temp;

                 //循环遍历

temp=temp.next;

}

}

代码解释:先查询数据在链表中是否有,需要循环遍历 ,当数据一致 并且hashcode一致时,我们才认为这才是两个相等的数据对象;接着 获取前一个节点对象。

根据索引删除节点

分析

根据索引删除节点,也就是说从第几个位置开始删除,默认 第一个位置索引为0 以此类推。

  1. 首先:删除的节点的索引不能超过总长度

  2. 其次:删除的节点 要先找到对应节点数据 再删除。

实现

/**

根据指定的索引来删除链表中的数据

@param index

*/

public void removeIndexObject(int index) {

int count=0;

if(index<0 ||index >=size){

System.out.println("越界");

return;

}

Node temp = head;

//记录前一个节点

Node prev = temp;

while (temp != null) {

if(count==index){

if(index==0){//说明删除的是头节点

head = temp.next;

}else{

//将要删除的前一个节点指向 要删除节点的后一个节点

prev.next=temp.next;

}

size--;//长度-1

break;

}

prev=temp;//记录上一个节点

temp=temp.next;

count++;

}

}

测试

public static void main(String[] args) {

SingleLink singleLink = new SingleLink();

singleLink.add(1);

singleLink.add(2);

singleLink.add(3);

System.out.println("删除前=================="+singleLink);

singleLink.removeObject(2);

System.out.println("删除后=================="+singleLink);

}

测试效果:

删除前==================[1,2,3]

删除后==================[1,3]

总结

通过删除节点我们发现,单链表的操作删除时,需要获取被删除的节点的上一个节点,获取上一个节点相对来时比较麻烦。如果使用双链表,那么这个问题就解决了。而且效率要比单链表要高些。下一章,我们来学习下双链表相关的知识,看是如何添加和删除数据的。


(点击图片可查看)


▼点击 阅读原文加入程序员大咖群

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

数据结构:线性表顺序表以及单链表详解

数据结构 链表_单链表的接口定义

数据结构之单链表的增删查改等操作画图详解

数据结构 单链表的简单理解和基本操作

数据结构之链表篇(单链表的常见操作)

数据结构学习笔记——链表的相关知识(单链表带头结点和不带头结点的基本操作)