链表思想
- 链表是以节点的方式进行存储
- 每个节点包含两个域:data+next:指向下一个节点
- 链表的各个节点并不一定是连续存储的
- 链表分为带头节点的链表和不带头节点的链表,根据实际需求来选择
我们以水浒英雄好汉的排名来解释链表结构在Java中的实现
class HeroNode
{
int id;
String name;
Hero next;
}
每个英雄节点包含一个id,一个姓名(data域) 和指向下一个节点的引用next.
单链表-英雄好汉
现在我们有一个需求,就是向单链表中添加多个英雄好汉的节点。
-
添加节点思想:先创建一个head头节点,表示单链表的头
(case 1)每添加一个节点,添加到单链表的最后
找到最后一个节点,将最后节点的next指向 新的节点
(case 2)按排名添加到链表对应位置,如果该位置已经被占用,则返回错误信息
通过辅助节点找到新添加的节点的位置(遍历)
新的节点.next = temp.next
temp.next = 新的节点 -
遍历链表思想:通过一个辅助变量来遍历整个单链表
-
删除节点思想:先找到要删除节点的前一个节点temp,temp.next = temp.next.next; 被删除的节点将不会有其他引用指向,会被垃圾回收。
-
查找单链表中倒数第K个节点(新浪)
1)编写一个方法,接受head参数+k参数
2)先遍历整个列表,得到链表的长度,再遍历size-k个节点返回 -
单链表的逆置(腾讯)
1)定义一个节点reverseHead = new HeroNode()
2)从头遍历原来的链表,每遍历一个节点则将其取出,放在新的链表的最前端
3)原来的链表的head.next = reverseHead.next -
从尾部到头输出单链表
思路1: 先逆置,缺点:会改变原链表的结构
思路2:利用栈 -
合并两个有序的单链表,合并后的单链表依然有序
双向链表
data + next + pre
遍历:和单链表一样,多了前向查找
添加到末尾:1. 辅助节点找到链表最后 temp.next = newNode newNode.pre = temp
修改:和原单链表相似
删除: 因为是双向链表,可以实现自我删除,直接定位到要删除的节点 temp.pre.next = temp.next temp.next.pre = trmp.pre
约瑟夫问题
可以使用不带头节点的单循环链表来实现,使用n,k,m来控制人数,从谁开始报数和每几个人出列一次,例如:
n = 20 人数
k = 3 从第三个开始报数
m = 3 每三个人出列
思想:
- 先创建第一个节点,让first指向该节点,并形成环状
- 加入节点
curBoy.next = newNode,
curBoy = curBoy.next,
newNode.next = first
3.遍历节点
curBoy.next = first
4.删除节点:需要一个辅助指针变量helper,事先指向尾节点 报数,让first和helper同时移动m-1次,删除first指向的节点
first = first.next
helper.next = first
Java自带的链表使用
java.util.LinkedList
参照ava 实例 - 在链表(LinkedList)的开头和结尾添加元素