package com.atguigu.linkedlist;
import java.util.Stack;
/**
* @author SongYu
* @version 1.0.0
* @ClassName SingleLinkedListDemo.java
* @Description 模拟双向链表
* @createTime 2022年06月08日 09:42:00
*/
public class DoubleLinkedListDemo {
public static void main(String[] args) {
//进行测试
HeroNode2 hero1 = new HeroNode2(1, "宋江", "及时雨");
HeroNode2 hero2 = new HeroNode2(2, "卢俊义", "玉麒麟");
HeroNode2 hero3 = new HeroNode2(3, "吴用", "智多星");
HeroNode2 hero4 = new HeroNode2(4, "公孙胜", "入云龙");
HeroNode2 hero5 = new HeroNode2(5, "关胜", "大刀");
HeroNode2 hero6 = new HeroNode2(6, "林冲", "豹子头");
//创建要给链表
DoubleLinkedList doubleLinkedList = new DoubleLinkedList();
// SingleLinkedList singleLinkedList2 = new SingleLinkedList();
// singleLinkedList2.addByOrder(hero3);
// singleLinkedList2.addByOrder(hero2);
// singleLinkedList2.addByOrder(hero5);
// singleLinkedList2.addByOrder(hero6);
//测试普通加入
// doubleLinkedList.add(hero1);
// doubleLinkedList.add(hero2);
// doubleLinkedList.add(hero3);
// doubleLinkedList.add(hero4);
//测试按编号排序加入
doubleLinkedList.add(hero4);
doubleLinkedList.add(hero3);
doubleLinkedList.add(hero2);
doubleLinkedList.add(hero1);
//展示
System.out.println("================初次展示");
doubleLinkedList.list();
System.out.println("================测试更新");
HeroNode2 heroNode = new HeroNode2(2, "张三丰", "太极掌门人");
doubleLinkedList.updated(heroNode);
doubleLinkedList.list();
System.out.println("================测试删除");
// doubleLinkedList.del(2);
// doubleLinkedList.del(1);
// doubleLinkedList.del(4);
doubleLinkedList.del(2);
doubleLinkedList.list();
System.out.println("================");
int length = getLength(doubleLinkedList.getHead());
System.out.println("链表有效节点个数为:" + length);
System.out.println("================");
HeroNode2 node = findLastIndexNode(doubleLinkedList.getHead(), 2);
System.out.println("您所查找的倒数节点为" + node);
System.out.println("================反转链表");
reversetList(doubleLinkedList.getHead());
doubleLinkedList.list();
System.out.println("================反转打印");
backPrintByStack(doubleLinkedList.getHead());
System.out.println("================合并两个链表");
//先把上面反转的链表1再反转回去
reversetList(doubleLinkedList.getHead());
System.out.println("================链表1:");
doubleLinkedList.list();
System.out.println("================链表2:");
// singleLinkedList2.list();
System.out.println("================合并两个链表");
// mergeLinkedList(singleLinkedList.getHead(), singleLinkedList2.getHead());
// singleLinkedList.list();
}
//链表面试题1:获取单链表的有效节点个数(注意不统计头节点)
public static int getLength(HeroNode2 head) {
if (head.next == null) {
return 0;
}
HeroNode2 temp = head;
int length = 0;
while (temp.next != null) {
temp = temp.next;
length++;
}
return length;
}
//链表面试题2:查找单链表中的倒数第k个节点【新浪面试题】
public static HeroNode2 findLastIndexNode(HeroNode2 head, int index) {
HeroNode2 temp = head.next;
int length = getLength(head);
if (head.next == null) {
return null;
}
if (index <= 0 || index > length) {
return null;
}
for (int i = 0; i < length - index; i++) {
temp = temp.next;
}
return temp;
}
//链表面试题3:单链表的反转【腾讯面试题】
public static void reversetList(HeroNode2 head) {
if (head.next == null || head.next.next == null) {
return;
}
HeroNode2 reverseHead = new HeroNode2(0, "", "");
HeroNode2 temp = head.next;
HeroNode2 next = null; //指向当前节temp的下一个节点
while (temp != null) {
next = temp.next; //因为下面第1行会把temp后面的节点改变,当下面第4行再取原temp后面的节点时就取不到了
temp.next = reverseHead.next;
reverseHead.next = temp;
temp = next;
}
head.next = reverseHead.next;
}
//链表面试题4:从尾到头打印单链表【百度面试题,要求方式:1.反向遍历。方式2:Stack栈】
//方式1:反向遍历,就是利用上面的reverseList方法将数组反转,缺点是遍历打印完,原链表的顺序也逆转了
//方式2:
public static void backPrintByStack(HeroNode2 head) {
Stack<HeroNode2> stack = new Stack<HeroNode2>();
HeroNode2 temp = head.next;
if (temp == null) {
System.out.println("链表为空,无法打印");
} else if (temp.next == null) {
System.out.println(temp);
return;
}
while (temp != null) {
stack.push(temp);
temp = temp.next;
}
int stackLength = stack.size();
for (int i = 0; i < stackLength; i++) {
String s = stack.pop().toString();
System.out.println(s);
}
}
//链表面试题5:合并两个有序的单链表,合并之后的链表依然有序(和并到链表1并返回)
public static void mergeLinkedList(HeroNode2 left, HeroNode2 right) {
if (left.next == null && right.next == null) {
System.out.println("链表不能都为空");
return;
}
HeroNode2 cur1 = left;
HeroNode2 cur2 = right.next;
HeroNode2 t1 = null;
HeroNode2 t2 = null;
while (cur1 != null) {
while (cur2 != null) {
t1 = cur2.next;
if (cur1.next != null && cur2.no < cur1.next.no) {
t2 = cur1.next;
cur1.next = cur2;
cur2.next = t2;
} else if (cur1.next != null && cur2.no > cur1.next.no) {
break;
} else {
cur1.next = cur2;
}
cur2 = t1;
}
cur1 = cur1.next;
}
}
//单个节点
static class HeroNode2 {
public int no;
public String name;
public String nickname;
public HeroNode2 next;
public HeroNode2 pre;
public HeroNode2(int no, String name, String nickname) {
this.no = no;
this.name = name;
this.nickname = nickname;
}
@Override
public String toString() {
return "HeroNode{" +
"no=" + no +
", name='" + name + '\'' +
", nickname='" + nickname +
'}';
}
}
//管理链表
static class DoubleLinkedList {
//定义头节点
private HeroNode2 head = new HeroNode2(0, "", "");
public HeroNode2 getHead() {
return head;
}
//添加节点到双向链表
public void add(HeroNode2 node) {
HeroNode2 temp = head;
//找到最后一个节点
while (true) {
if (temp.next == null) {
break;
}
temp = temp.next;
}
temp.next = node;
node.pre = temp;
}
//显示链表[遍历]
p
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
算法与数据结构涵盖了以下主要内容: 数据结构(Data Structures): 逻辑结构:描述数据元素之间的逻辑关系,如线性结构(如数组、链表)、树形结构(如二叉树、堆、B树)、图结构(有向图、无向图等)以及集合和队列等抽象数据类型。 存储结构(物理结构):描述数据在计算机中如何具体存储。例如,数组的连续存储,链表的动态分配节点,树和图的邻接矩阵或邻接表表示等。 基本操作:针对每种数据结构,定义了一系列基本的操作,包括但不限于插入、删除、查找、更新、遍历等,并分析这些操作的时间复杂度和空间复杂度。 算法: 算法设计:研究如何将解决问题的步骤形式化为一系列指令,使得计算机可以执行以求解问题。 算法特性:包括输入、输出、有穷性、确定性和可行性。即一个有效的算法必须能在有限步骤内结束,并且对于给定的输入产生唯一的确定输出。 算法分类:排序算法(如冒泡排序、快速排序、归并排序),查找算法(如顺序查找、二分查找、哈希查找),图论算法(如Dijkstra最短路径算法、Floyd-Warshall算法、Prim最小生成树算法),动态规划,贪心算法,回溯法,分支限界法等。 算法分析:通过数学方法分析算法的时间复杂度(运行时间随数据规模增长的速度)和空间复杂度(所需内存大小)来评估其效率。 学习算法与数据结构不仅有助于理解程序的内部工作原理,更能帮助开发人员编写出高效、稳定和易于维护的软件系统。
资源推荐
资源详情
资源评论
收起资源包目录
DataStructure-尚硅谷-数据结构与算法-数据结构.zip (24个子文件)
open_suanfayushujujiegouxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcxxxxxxxxxxxxcxvcvcv
pom.xml 578B
src
main
java
com
atguigu
sort
InsertSort.java 1KB
BubbleSort3.java 956B
SelectSort.java 894B
BubbleSort.java 1KB
linkedlist
DoubleLinkedListDemo.java 11KB
Josepfu.java 4KB
SingleLinkedListDemo.java 10KB
stack
Calculator.java 5KB
LinkedListStackDemo.java 4KB
ArrayStackDemo.java 3KB
PolandNotation.java 6KB
queue
ArrayQueueDemo.java 4KB
CircleArrayQueueDemo.java 4KB
recursion
Queen8.java 2KB
MiGong.java 3KB
sparsearray
SparseArray.java 3KB
.idea
jarRepositories.xml 845B
vcs.xml 180B
misc.xml 528B
inspectionProfiles
Project_Default.xml 1KB
compiler.xml 535B
.gitignore 176B
target
classes
com
atguigu
sparsearray
SparseArray.class 3KB
共 24 条
- 1
资源评论
极致人生-010
- 粉丝: 3982
- 资源: 3087
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- buck 同步buck变器仿真 模型内包含开环,电压单环,电流单环电压电流双闭环 控制策略有PI,PID,电压前馈,前馈补偿控
- IRFR4343TRPBF-VB一种N-Channel沟道TO252封装MOS管
- COMSOL断层突水非线性渗流-应力耦合案例 提供COMSOL流固耦合(岩土+Brinkman流体+蠕动流)案例文件,案例实现了
- IRFR4105ZPBF-VB一种N-Channel沟道TO252封装MOS管
- COMSOL裂隙动水注浆扩散数值模拟 针对动水注浆中常用的2种速凝浆液,水泥–水玻璃浆液与高聚物改性水泥浆液,考虑浆液黏度时变特
- 掌握Python循环控制:for循环与while循环的深入指南.pdf
- comsol案例,水驱油,两相流,石油开发基础案例,一注四采 注水井采油井,开发井网.
- Linux内核情景分析(上下全集).zip
- IRFR4105TRR-VB一种N-Channel沟道TO252封装MOS管
- comsol本案例建立成二维轴对称模型,物理场采用两个PDE模块,分别表示水分场和温度场,一个固体力学模块,表示应力场 求解器
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功