【数据结构和算法】001 单链表 LinkedList
小朋友,你是否有很多问号?为什么?别人都在看漫画,而我在学画画,对着钢琴说话...

一、单链表(LinkedList)介绍和内存布局
链表是有序的列表,它在内存中的实际存储结构如下:

看上去虽然无序,但ta是靠每个链表节点元素的 地址 和 next域 来分清首尾相连的顺序,如下图所示,由头指针指向第一个元素,进而第二个、三个...

链表的逻辑结构:

二、单链表创建、遍历实现以及单链表节点增、删、改、查操作
1、创建、新增、遍历显示
模型如下:1)head节点 2)中间节点 3)尾结点
每个节点的next域指向下一个节点的对象地址,尾结点为空

新建所需实体类:
package ...; /**
* @Author: ldk
* @Date: 2020/3/29 21:18
* @Describe:
*/
public class HeroNode {
public int no;
public String name;
public String nickName;
public HeroNode next;//指向下一个节点 //构造节点对象
public HeroNode(int no, String name, String nickName) {
this.no = no;
this.name = name;
this.nickName = nickName;
} //重写toString() @Override
public String toString() {
return "HeroNode{" +
"no=" + no +
", name='" + name + '\'' +
", nickName='" + nickName + '\'' +
'}';
}
//GetSet方法自行脑补....
}
创建 SingleLinkedList 类,编写 添加 和 遍历 的方法 并 创建main方法测试:
package ...; /**
* @Author: ldk
* @Date: 2020/3/29 21:25
* @Describe:
*/
public class LinkedListTest {
public static void main(String[] args) {
HeroNode h1 = new HeroNode(1, "张三", "小三");
HeroNode h2 = new HeroNode(2, "李四", "小四");
HeroNode h3 = new HeroNode(3, "王五", "小五");
HeroNode h4 = new HeroNode(4, "赵六", "小六");
SingleLinkedList singleLinkedList = new SingleLinkedList();
singleLinkedList.add(h1);
singleLinkedList.add(h2);
singleLinkedList.add(h3);
singleLinkedList.add(h4);
singleLinkedList.detail();
} static class SingleLinkedList {
//创建头结点
private HeroNode head = new HeroNode(0, "", ""); //节点添加方法
public void add(HeroNode heroNode) { //拿到头结点
HeroNode temp = head;
//找到最后一个节点,把next域指向要添加的节点
while (true) {
if (temp.next == null) {
break;
}
temp = temp.next;
}
temp.next = heroNode;
} //显示链表【遍历】
public void detail() {
if (head.next == null) {
System.out.println("链表为空!");
return;
}
//获取一个临时指针
HeroNode temp = head.next;
while (true) {
if (temp.next == null){
System.out.println(temp.toString());
System.out.println("就这么多了~~");
break;
}
System.out.println(temp.toString());
temp = temp.next;
}
}
}
}
运行结果:

2、按顺序插入节点
上面的测试是从1,2,3,4依次插入,那么,链表本身是有序的,我们能不能按照no字段乱序插入实现自动递增排序,且从重复元素不再重复插入,
意思就是,插入顺序改成1432,但链表内部结构依然是1234
代码只需稍微对add()方法修改一下:
//按照字段no 升序插入
public void add2(HeroNode heroNode) {
//获取指针
HeroNode temp = head;
while (true) {
if (temp.next == null) {
break;
} else if (temp.next.no == heroNode.no) {
System.out.println("该节点已经存在~");
return;
} else if (temp.next.no > heroNode.no) {
break;
}
temp = temp.next;
}
heroNode.next = temp.next;
temp.next = heroNode;
}
凌乱且重复的插入顺序:

有序的打印结果:
依然是1234的顺序,而且重复的元素不再插入 ~

其余增删改查有时间可以做自己思考一下,这里不再赘述。
三、单链表新浪、腾讯、百度面试题

解答暂时值分析思路,代码后期慢慢填补:
1)思路:从头结点的下一个开始,一直遍历,每遍历一个即+1,直到.next为空,此所得即为链表长度
2)思路:依然是遍历,从第一个一直遍历到第length-k的下一个即为k
代码(后补):
3)思路:有点难度,但也是很清晰的。
分为母链和子链,母链双指针,子链单指针
母链拆一个节点拼接到子链头部后第一个,以此类推,得到的全新子链即为反转链:
代码(后补):
4)思路:同4,反转后,打印即可。
5)思路:以其中一个链表为母链,另一个为子链,遍历子链,挨个插入母联即可。
2020-03-29 21:02:13
【数据结构和算法】001 单链表 LinkedList的更多相关文章
- Java数据结构-线性表之单链表LinkedList
线性表的链式存储结构,也称之为链式表,链表:链表的存储单元能够连续也能够不连续. 链表中的节点包括数据域和指针域.数据域为存储数据元素信息的域,指针域为存储直接后继位置(一般称为指针)的域. 注意一个 ...
- 【数据结构与算法】单链表操作(C++)
#include <stdio.h> #include <malloc.h> /*单链表节点定义*/ typedef struct LNode { int data; //da ...
- C:数据结构与算法之单链表
单链表相对于顺序表比较难理解,但是比较实用,单链表的插入,删除不需要移动数据元素,只需要一个指针来寻找所需要的元素,还有一个大优点就是不浪费空间,当你想要增加一个结点可以申请(malloc())一个结 ...
- python数据结构与算法之单链表
表的抽象数据类型 ADT list: #一个表的抽象数据类型 List(self) #表的构造操作,创建一个空表 is_empty ...
- 2、java数据结构和算法:单链表: 反转,逆序打印, 合并二个有序链表,获取倒数第n个节点, 链表的有序插入
什么也不说, 直接上代码: 功能点有: 1, 获取尾结点 2, 添加(添加节点到链表的最后面) 3, 添加(根据节点的no(排名)的大小, 有序添加) 4, 单向链表的 遍历 5, 链表的长度 6, ...
- 数据结构之 线性表---单链表的操作B(先逆序+再删除重复元素)
数据结构上机测试2-2:单链表操作B Time Limit: 1000MS Memory limit: 65536K 题目描述 按照数据输入的相反顺序(逆位序)建立一个单链表,并将单链表中重复的元素删 ...
- 数据结构之 线性表---单链表操作A (删除链表中的指定元素)
数据结构上机测试2-1:单链表操作A Time Limit: 1000MS Memory limit: 4096K 题目描述 输入n个整数,先按照数据输入的顺序建立一个带头结点的单链表,再输入一个数据 ...
- java数据结构和算法04(链表)
前面我们看了数组,栈和队列,大概就会这些数据结构有了一些基本的认识,首先回顾一下之前的东西: 在数组中,其实是分为有序数组和无序数组,我简单实现了无序数组,为什么呢?因为有序数组的实现就是将无序数组进 ...
- 《数据结构》2.3单链表(single linked list)
//单链表节点的定义 typedef struct node { datatype data; struct node *next; }LNode,*LinkList; //LNode是节点类型,Li ...
随机推荐
- Nginx设置目录浏览并配置验证
Nginx默认是不允许进行列目录的,如果需要使某个目录可以进行浏览,可如下设置:如: 让/var/www/soft 这个目录在浏览器中完成列出. 一.设置目录浏览1.打开/usr/local/ngin ...
- 记一个 Base64 有关的 Bug
本文原计划写两部分内容,第一是记录最近遇到的与 Base64 有关的 Bug,第二是 Base64 编码的原理详解.结果写了一半发现,诶?不复杂的一个事儿怎么也要讲这么长?不利于阅读和理解啊(其实是今 ...
- Linux命令学习神器!命令看不懂直接给你解释!
大家都知道,Linux 系统有非常多的命令,而且每个命令又有非常多的用法,想要全部记住所有命令的所有用法,恐怕是一件不可能完成的任务. 一般情况下,我们学习一个命令时,要么直接百度去搜索它的用法,要么 ...
- 网络编程模型(C/S模型和B/S模型)
目录 网络应用编程模型 互联网与企业内部网 早期计算机网络的通信模型 C/S模式 B/S模式 B/S 和 C/S 的区别 网络应用编程模型 互联网与企业内部网 网络的两个含义: 互联网 :互联网(In ...
- XSS_跨站脚本攻击
前段时间在网上看到一个网址,好奇之下进去看了看.胜利的条件是你录入一个串,让其调用prompt(1) .发现里面有好多想不到的东西,今天终于悠闲了来这里说说XSS. XSS 原理 恶意攻击者往Web页 ...
- Slog27_支配vue框架初阶项目之博客网站-样式居中
ArthurSlog SLog-27 Year·1 Guangzhou·China July 30th 2018 GitHub 掘金主页 简书主页 segmentfault 没有写够足够的代码量,想成 ...
- PxCook+photoshop实现傻瓜式切图(推荐小白使用)
确定需求 刚入门前端的小伙伴经过一个阶段的学习,已经准备小试牛刀了.但看到设计师给出的psd图,又头疼了,天啊撸,怎么办,我不会切图啊.今天我就带领小白学习傻瓜式切图.包学包会.( ̄▽ ̄)" ...
- PostCSS的插件 -- 关于vue rem适配布局方案
PostCSS的插件 作用:用于自动将像素单元生成rem单位 记以下三种 postcss-plugin-px2rem postcss-pxtorem postcss-px2rem 任选一种,最近大家推 ...
- php判断二个数最大公约数
$m = isset($_GET['m']) ? $_GET['m'] : 12; $n = isset($_GET['n']) ? $_GET['n'] : 8; //判断mn的大小 if($m&g ...
- 小程序session_key失效解决方案、后台解密个人数据信息
目录 一.登录会话密钥 session_key 有效性 二.解决登录session_key 的问题 案例:解决session_key 过期问题,发送个人信息后台解密 后端解密信息,存入数据库 mysq ...