数据结构与算法(02)
1.链表
1.1 链表介绍
链表是有序的列表,但是在内存中存储如下
小结上图:
- 链表是以节点的方式来存储,是链式存储
- 每个节点包含data域,next域:指向下一个节点
- 如图:链表的各个节点不一定是连续存储
- 链表分带节点的链表和没有头节点的链表
单链表(带头结点)逻辑结构示意图如下
1.2 单链表的应用实例
使用head头的单向链表实现–对水浒传的英雄人物进行增删改查
1). 第一种方法在添加英雄时,直接添加到链表的尾部
添加(创建)
1.先创建一个head头结点,作用就是表示单链表的头
2.每添加一个节点,就直接加入到链表的最后
遍历
1.通过一个辅助变量遍历,帮助遍历整个链表
2). 第二种方式在添加英雄时,根据排名将英雄插入到指定位置
需要按照编号的顺序添加
1.首先找到新添加的节点的位置是通过辅助变量(指针),通过遍历来搞定
2.新的节点next=temp.next
3.将temp.next=新的节点
3)修改节点功能
(1)先找到该节点,通过遍历
(2)temp.name=newHeroNode.name;
temp.nickname=newHeroNode.nickname
4)删除节点
从单链表中删除一个节点的思路
1.先找到需要删除的这个节点的前一个节点temp
2.temp.next=temp.next.next
3.被删除的节点,将不会有其他引用指向,会被垃圾回收机制回收
1.3 单链表面试题
-
求单链表中有效节点的个数
代码如下:
-
查找单链表中的倒数第k个节点
代码如下:
-
单链表的反转
思路分析:
思路:
1.先定义一个节点reverseHead=new HeroNode();
2.从头到尾遍历原来的链表,每遍历一个节点,就将其取出,并放在新的链表reverseHead的最前端。
3.原来的链表的head.next=rweverseHead.next
- 从尾到头打印单链表
思路:
1.方式1:先将单链表进行反转操作,然后在遍历即可,这样做的问题是会破坏原来的单链表的结构
2.方式2:可以利用栈这个数据结构,将各个节点压入到栈中,然后利用栈的先进后出的特点