先赞再看,养成习惯!

链表作为一种常用的数据结构,我们还是有必要了解一下的,如果有不太了解什么是“链表”的可以查看一下之前的文章。今天让我们动手实现一个“双向链表”。

双向链表的节点类

public class Node {

/**

* 数据域

*/

public String data;

/**

* 指针域(指向下一个节点)

*/

public Node next;

/**

* 指针域(指向前一个节点)

*/

public Node pre;

/**

* 构造方法

*/

public Node(String data) {

this.data = data;

}

}

双向链表(带头节点)的基本代码

public class DoubleLinkedList {

// 头节点

private Node herd = new Node("HerdNode");

public Node getHerd() {

return herd;

}

public void setHerd(Node herd) {

this.herd = herd;

}

}

在链表尾部添加节点

public void addAfter(Node newNode) {

// 定义辅助变量,遍历链表使用

Node temp = herd;

while (true){

// 到达列表尾部

if(temp.next == null){

break;

}

// 后移辅助节点

temp = temp.next;

}

// 在链表尾部添加新节点

temp.next = newNode; // 将原链表的尾部节点的下一个指针域指向新节点

newNode.pre = temp; // 将新节点的前一个指针域指向原链表的尾部节点

}

在指定节点内容后插入数据

开始编码前,先看下图,有助于理解代码。

/**

* 在指定节点内容后插入数据

*

* @param nodeData 指定节点的内容(插入到哪个节点后)

* @param newNode 新节点

*/

public void insertAfterNode(String nodeData, Node newNode) {

// 参数校验

if (nodeData == null) {

throw new RuntimeException("入参有误!");

}

// 定义辅助变量,遍历链表使用

Node temp = herd;

// 定义标记,标识找到指定内容的节点

boolean flag = false;

while (true) {

// 到达链表尾部,结束循环。

if (temp == null) {

break;

}

// 找到指定的节点,结束循环。

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

flag = true;

break;

}

// 将辅助节点后移

temp = temp.next;

}

if (flag) {

// 注:temp代表的是需要在该节点后插入新节点

// 判断是否是在链表尾部添加节点

if (temp.next != null) {

// 将temp节点的下一个节点的前一个指针域,指向新节点。

temp.next.pre = newNode;

// 将新节点的下一个指针域,指向temp节点的下一个节点。

newNode.next = temp.next;

}

// 将temp节点的下一个指针域指向新节点。

temp.next = newNode;

// 将新节点的前一个指针域指向temp节点。

newNode.pre = temp;

} else {

throw new RuntimeException("未找到指定节点无法插入新节点!");

}

}

根据指定节点内容删除节点

为了更好的理解代码,请先看下图。

/**

* 删除指定节点

*

* @param data 指定节点内容(被删除的节点内容)

*/

public void delete(String data) {

// 参数校验

if (data == null) {

throw new RuntimeException("入参有误!");

}

// 定义辅助变量,遍历链表使用

Node temp = herd;

// 定义标记,标识找到指定内容的节点

boolean flag = false;

while (true){

// 到达链表尾,结束循环。

if(temp == null){

break;

}

// 找到待删除的节点

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

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("未找到要删除的节点!");

}

}

通过上面的代码和图片相信大家对双向链表会有一个自己的认知,修改和查询相对简单,我就不在演示。有问题的大家可以指出来。感觉文章写的还不错的记得点个赞在走哟。

设某链表中最常用的操作是在链表的尾部_面试官:“双向链表”都不会,谁给你跳槽的勇气?...相关推荐

  1. 设某链表中最常用的操作是在链表的尾部_Redis系列(二)底层数据结构之双端链表...

    前言 定义 优劣 双向链表 无环链表 带有头指针和尾指针 带有长度计数器 总结 参考文章 联系我 前言 Redis 已经是大家耳熟能详的东西了,日常工作也都在使用,面试中也是高频的会涉及到,那么我们对 ...

  2. c语言找出链表中倒数第k的数,查找链表中倒数第k个结点

    题目:输入一个单向链表,输出该链表中倒数第 k 个结点.链表的倒数第 0 个结点为链表的尾指针. 分析:为了得到倒数第 k 个结点,很自然的想法是先走到链表的尾端,再从尾端回溯 k 步.可是输入的是单 ...

  3. 一个单向链表,输出该链表中倒数第k个结点,链表的倒数第0个结点为链表的尾指针

    输入一个单向链表,输出该链表中倒数第k个结点.链表的倒数第0个结点为链表的尾指针 typedef struct _node_t {struct _node_t *next;int data; }Nod ...

  4. 链表相关操作:创建链表、遍历链表、求链表长度、链表中删除一个节点、链表中插入一个节点、反转单链表...

    1 #include<iostream> 2 #include<stdlib.h> 3 4 typedef struct node 5 { 6 int data; 7 stru ...

  5. 剑指offer(C++)-JZ22:链表中倒数最后k个结点(数据结构-链表)

    作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 题目描述: 输入一个长度为 n 的链表,设链表中的元素的值为 ai ,返回该链表中倒数第k个节点 ...

  6. python删除链表中重复的节点_Java编程删除链表中重复的节点问题解决思路及源码分享...

    一. 题目 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 二. 例子 输入链表:1->2->3->3->4->4-&g ...

  7. c语言链表中何时用点何时用箭头,链表基本操作及其过程详细叙述

    链表概述:链表是一种常见的数据结构.数组可以存放数据,但是使用数组时要先指定数组中包含元素的个数,即数组长度.但是如果向这个数组中加入的元素个数超过了数组的大小时,便不能将内容完全保存.例如在定义一个 ...

  8. 剑指offer面试题22. 链表中倒数第k个节点(链表)

    题目描述 输入一个链表,输出该链表中倒数第k个节点.为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点.例如,一个链表有6个节点,从头节点开始,它们的值依次是1.2.3.4.5. ...

  9. [数据结构]题海啊,全是水(三)链表中倒数第k个节点、链表的回文结构、链表分割

    这是一个目录 链表中倒数第k个节点 解法一 解法二 链表的回文结构 思路 代码 链表分割 思路 代码 最后 菜鸡大学生的数据结构--刷题篇3 我们的第三题小宝贝儿回归了! 菜鸡大学生明白,笔试oj题目 ...

  10. 保存数组_面试官:讲一讲你对据结构——数组、链表、栈、队列的理解

    一.解释定义 1. 数据结构: 数据结构是指相互之间存在一种或多种特定关系的数据元素的集合.再简单描述一下:数据结构就是描述对象间逻辑关系的学科. 如果还是不太清楚下面会举例说明的. 2. 数据存储结 ...

最新文章

  1. [SimpleOJ229]隧道
  2. django-Modelform
  3. linux之cal命令详解,linux命令大全之cal命令详解(显示日历)
  4. scala集合常用方法:foldRight
  5. [zz]c++ list sort方法
  6. 瑞数(裁判文书)js的加密分析
  7. Python--DBUtil
  8. unable to apply changes:plugins App links assistant,firebase services won'
  9. axure创建自定义元件库
  10. ArchLinux安装笔记「双系统U盘安装」(2018-11-19)
  11. 笔记本电脑频繁自动重启_笔记本电脑经常自动重启怎么办
  12. 小程序容器对政务服务平台建设的帮助
  13. flashpaper java_Flash中使用FlashPaper - javaplan - JavaEye技术网站
  14. python爬取淘宝数据遇见的坑
  15. 《庄子·杂篇·庚桑楚第二十三》
  16. 科沃斯扫地机器人抓不转_科沃斯扫地机器人一边转一边不转什么原因 科沃斯扫地机器人常见...
  17. Windows 系统上查询 NVIDIA GPU 型号、CUDA 版本和驱动程序版本
  18. 计算机常见故障 英语词汇,计算机常用英语词汇大全剖析.doc
  19. Resharper使用详解(转)
  20. 洛谷10月月赛Round.1| P3400 仓鼠窝[单调栈]

热门文章

  1. 【原】==与isEqual的比较
  2. 谁能再一次接受“南京大×××”不存在?
  3. Equals() 和 运算符 == 重载准则 (C# 编程指南)
  4. 移动滑块改变使用容量
  5. 多语言可视化编辑webControl 2.0版
  6. vue里动态设置并获取ref
  7. .NET使用存储过程实现对数据库的增删改查
  8. qemu模拟器下编译运行基于riscv指令集的Linux操作系统
  9. windows下git安装配置
  10. SNF开发平台WinForm之十二-发送手机短信功能调用-金笛-SNF快速开发平台3.3-Spring.Net.Framework...