Java数据结构与算法3 链表

链表思想

  1. 链表是以节点的方式进行存储
  2. 每个节点包含两个域:data+next:指向下一个节点
  3. 链表的各个节点并不一定是连续存储的
  4. 链表分为带头节点的链表和不带头节点的链表,根据实际需求来选择
    我们以水浒英雄好汉的排名来解释链表结构在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 每三个人出列

思想:

  1. 先创建第一个节点,让first指向该节点,并形成环状
  2. 加入节点
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)的开头和结尾添加元素

发布了80 篇原创文章 · 获赞 332 · 访问量 70万+

猜你喜欢

转载自blog.csdn.net/qq_40527086/article/details/104340629