《算法通关村第一关——链表青铜挑战笔记》

1.理解Java是如何构造出链表的

我们知道JVM里有栈区和堆区,栈区主要存引用,也就是一个指向实际对象的地址,而堆区存的才是创建的对象

例如下面这个类:

public class Node {
   int val;
   Node next;
}

我们可以知道next就指向了下一个Node了

具体情况如下图:

这里通过栈中的引用就可以找到val(1),然后val(1)结点又存了指向val(2)的地址(也就是next),而val(3)又存了指向val(4)的地址,所以就构造出了一个链条访问结构。

在Java配套代码中BasicLink类,我们debug一下看一下从head开始next会发现是这样的:

这就是一个简单的线性访问了,所以链表就是从head开始,逐个开始向后访问,而每次所访问对象的类型都是一样的。


2.链表增加元素

在链表中添加元素的原理如下图:

也就是将需要添加元素的位置的前驱结点的next指针赋值给新添加结点的next,再将next指针指向newNode

newNode.next = Node1.next;
Node1.next = newNode;

上述代码不可交换位置!!

因为如果先执行Node1.next = newNode; 那么就失去了访问Node2的方式,Node2将变为不可达,导致添加操作失败并造成链表结构发生变化

在首部添加元素

在首部添加元素原理如下:

具体代码如下:

Node newNode = new Node(1);
newNode.next = head;
head = newNode;

在首部添加元素相对而言较为简单,只需将新结点指向原首结点,然后再将head指针赋值为新结点即可。

在中间添加元素

与先前的添加元素的原理一致,此处不再赘述。

在尾部添加元素

与在中间添加元素差不多,只不过需要注意的是此处新节点的next指针指向的是null

代码如下:

Node current = head;

while(current.next != null)
{
     current = current.next   //往后遍历,直到最后一个结点
}

Node newNode = new Node(1);

newNode.next = current.next;
current.next = newNode;

从代码上看,似乎只比原本多了一个向后遍历的代码


3.链表删除元素

我们还是先来看在链表中删除元素的原理图:

此时要删除的结点为Node2,我们将他的前驱节点Node1的current指针指向他的后继结点Node3,这样Node2就会被标记为不可达,在后续Java虚拟机(JVM)会通过垃圾回收器自动回收此无效节点,并释放它们占用的内存。

代码如下:

Node1.next = Node1.next.next;

在首部删除元素

在首部删除元素原理如下:

可以看出删除首部元素较为简单,只需将head = head.next 原本的首部元素便会变为不可达。

在中间删除元素

同上,与先前的删除元素的原理一致,此处不再赘述。

在尾部删除元素

在尾部删除元素原理如下:

Node current = head;

while(current.next.next != null)
{
     current = current.next   //往后遍历,直到最后一个结点
}

current.next = current.next.next

原理与删除中间元素也近乎一致,只不过指向了null,且多了一次遍历

总结

通过本次学习,掌握了链表的基本操作方法以及在java中链表的结构

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值