设某链表中最常用的操作是在链表的尾部_面试官:“双向链表”都不会,谁给你跳槽的勇气?...
先赞再看,养成习惯!
链表作为一种常用的数据结构,我们还是有必要了解一下的,如果有不太了解什么是“链表”的可以查看一下之前的文章。今天让我们动手实现一个“双向链表”。
双向链表的节点类
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("未找到要删除的节点!");
}
}
通过上面的代码和图片相信大家对双向链表会有一个自己的认知,修改和查询相对简单,我就不在演示。有问题的大家可以指出来。感觉文章写的还不错的记得点个赞在走哟。
设某链表中最常用的操作是在链表的尾部_面试官:“双向链表”都不会,谁给你跳槽的勇气?...相关推荐
- 设某链表中最常用的操作是在链表的尾部_Redis系列(二)底层数据结构之双端链表...
前言 定义 优劣 双向链表 无环链表 带有头指针和尾指针 带有长度计数器 总结 参考文章 联系我 前言 Redis 已经是大家耳熟能详的东西了,日常工作也都在使用,面试中也是高频的会涉及到,那么我们对 ...
- c语言找出链表中倒数第k的数,查找链表中倒数第k个结点
题目:输入一个单向链表,输出该链表中倒数第 k 个结点.链表的倒数第 0 个结点为链表的尾指针. 分析:为了得到倒数第 k 个结点,很自然的想法是先走到链表的尾端,再从尾端回溯 k 步.可是输入的是单 ...
- 一个单向链表,输出该链表中倒数第k个结点,链表的倒数第0个结点为链表的尾指针
输入一个单向链表,输出该链表中倒数第k个结点.链表的倒数第0个结点为链表的尾指针 typedef struct _node_t {struct _node_t *next;int data; }Nod ...
- 链表相关操作:创建链表、遍历链表、求链表长度、链表中删除一个节点、链表中插入一个节点、反转单链表...
1 #include<iostream> 2 #include<stdlib.h> 3 4 typedef struct node 5 { 6 int data; 7 stru ...
- 剑指offer(C++)-JZ22:链表中倒数最后k个结点(数据结构-链表)
作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 题目描述: 输入一个长度为 n 的链表,设链表中的元素的值为 ai ,返回该链表中倒数第k个节点 ...
- python删除链表中重复的节点_Java编程删除链表中重复的节点问题解决思路及源码分享...
一. 题目 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 二. 例子 输入链表:1->2->3->3->4->4-&g ...
- c语言链表中何时用点何时用箭头,链表基本操作及其过程详细叙述
链表概述:链表是一种常见的数据结构.数组可以存放数据,但是使用数组时要先指定数组中包含元素的个数,即数组长度.但是如果向这个数组中加入的元素个数超过了数组的大小时,便不能将内容完全保存.例如在定义一个 ...
- 剑指offer面试题22. 链表中倒数第k个节点(链表)
题目描述 输入一个链表,输出该链表中倒数第k个节点.为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点.例如,一个链表有6个节点,从头节点开始,它们的值依次是1.2.3.4.5. ...
- [数据结构]题海啊,全是水(三)链表中倒数第k个节点、链表的回文结构、链表分割
这是一个目录 链表中倒数第k个节点 解法一 解法二 链表的回文结构 思路 代码 链表分割 思路 代码 最后 菜鸡大学生的数据结构--刷题篇3 我们的第三题小宝贝儿回归了! 菜鸡大学生明白,笔试oj题目 ...
- 保存数组_面试官:讲一讲你对据结构——数组、链表、栈、队列的理解
一.解释定义 1. 数据结构: 数据结构是指相互之间存在一种或多种特定关系的数据元素的集合.再简单描述一下:数据结构就是描述对象间逻辑关系的学科. 如果还是不太清楚下面会举例说明的. 2. 数据存储结 ...
最新文章
- [SimpleOJ229]隧道
- django-Modelform
- linux之cal命令详解,linux命令大全之cal命令详解(显示日历)
- scala集合常用方法:foldRight
- [zz]c++ list sort方法
- 瑞数(裁判文书)js的加密分析
- Python--DBUtil
- unable to apply changes:plugins App links assistant,firebase services won'
- axure创建自定义元件库
- ArchLinux安装笔记「双系统U盘安装」(2018-11-19)
- 笔记本电脑频繁自动重启_笔记本电脑经常自动重启怎么办
- 小程序容器对政务服务平台建设的帮助
- flashpaper java_Flash中使用FlashPaper - javaplan - JavaEye技术网站
- python爬取淘宝数据遇见的坑
- 《庄子·杂篇·庚桑楚第二十三》
- 科沃斯扫地机器人抓不转_科沃斯扫地机器人一边转一边不转什么原因 科沃斯扫地机器人常见...
- Windows 系统上查询 NVIDIA GPU 型号、CUDA 版本和驱动程序版本
- 计算机常见故障 英语词汇,计算机常用英语词汇大全剖析.doc
- Resharper使用详解(转)
- 洛谷10月月赛Round.1| P3400 仓鼠窝[单调栈]
热门文章
- 【原】==与isEqual的比较
- 谁能再一次接受“南京大×××”不存在?
- Equals() 和 运算符 == 重载准则 (C# 编程指南)
- 移动滑块改变使用容量
- 多语言可视化编辑webControl 2.0版
- vue里动态设置并获取ref
- .NET使用存储过程实现对数据库的增删改查
- qemu模拟器下编译运行基于riscv指令集的Linux操作系统
- windows下git安装配置
- SNF开发平台WinForm之十二-发送手机短信功能调用-金笛-SNF快速开发平台3.3-Spring.Net.Framework...