单链表结点的删除(思路分析)
思路分析:
- 我们要删除一个节点就要先找到这个节点的前一个节点
- 只要我们是对一个链表进行插入一个结点或者删除一个节点的操作的时候我们要注意: 这个时候我们肯定是要修改链表的前一个位置的
- 我们删除的结点肯定是从首元节点开始的,但是我们要找的不是首元节点,因为我们想要删除一个节点就要找这个节点的前一个位置的结点,所以我们这个时候我们的辅助指针是要从头结点开始的
- temp.next = temp.next.next
- 这一步就是将我们想要删除的结点删除掉的算法,因为这个时候我们的temp是指向了我们的待删除结点的前一个位置,所以这个时候我们就要让待删除节点的上一个结点的指针域指向带删除结点的后一个节点的指针域就可以了,就可以跳过我们的待删除结点了 —> 也就是成功将我们的待删除结点删除掉了
- 被删除的结点将会没有引用指向该结点,最终就会被垃圾回收机制回收
思路分享:
我们对于要寻找位置,然后对指定位置进行操作的需求, 我们都可以使用以下思路解决:
第一步: 定义 标识和辅助指针
- 首先我们定义一个boolean类型的变量flag,这个boolean变量就是用来标识是否找到了想要寻找的位置,然后定义一个辅助变量帮助我们去寻找这个位置
- 我们可以给flag初始值赋值为false表示没有找到,如果找到了就将flag的值修改为true
第二步: while循环遍历找位置
- 然后我们就对链表进行遍while循环历,使用一个辅助指针(变量)temp去遍历,通过各种if语句去找我们想要找的位置,当找到我们想要找到的位置之后就将我们的flag修改为true,然后就直接退出循环,这个时候temp肯定还是指向我们想要找的位置的,如果在链表中没有找到我们想要找的位置,这个时候flag的值就不用修改(也就是还是false,也就是表示链表中没有我们想要寻找的位置)
第三步: 通过标识执行指定操作
- 最后我们使用我们定义的flag变量进行判断,如果flag为false,那么就输出一个没有找到我们要寻找的位置,这个时候就是表示没有找到,如果flag变量的值为true,那么就进行对应的我们要做的操作
注意: 我们的辅助指针(变量)的作用是来指向我们要操作的结点的,而不是直接指向我们要删除或者要修改的结点的
- 因为我们如果是要对某个结点进行删除操作,这个时候我们直接想删除的结点就是这个待删除结点,但是我们实际要操作的位置却不是这个待删除结点所在位置 — > 因为我们要删除一个节点就要通过这个待删除结点的前一个位置的结点来进行删除,我们要让带删除结点的前一个位置直接执行待删除结点的后一个位置
- 我们来通俗易懂的将一个例子:
- 就举一个例子,我们要删除一个结点,这个时候我们明知道我们只有拿到这个待删除结点的前一个结点,这个时候我们才能进行删除操作,那么这个时候我们如果是偏偏获取的是我们待删除结点,也就是这个时候temp指向我们的待删除结点,这个时候就算求得了我们的待删除结点的位置,这个时候能操作?
- 显然是不能操作的,我们的删除操作肯定是要先拿到我们的待删除结点的前一个位置的结点的,但是这个时候我们拿到的是待删除结点,这个时候肯定是操作不了的—> 因为我们这里是一个单链表,这个时候我们只能从前往后去找,不能从后往前去找
- 所以我们一定要拿到我们的待删除结点的上一个位置的结点,也就是我们要操作的结点,获得了这个结点之后我们就可以进行我们的删除操作了
- 那么有的人可能会说: 我们如果是使用temp表示待删除结点的上一个位置的结点,这个时候我们如何判断我们找到了待删除结点? ,我们判断待删除结点不是又要通过待删除结点的no属性和我们传入删除方法的数值进行比较?(因为在这里我们是通过no属性来匹配,然后进行删除)
- 我们之前都说过了,我们的单链表可以使用前面的结点表示后面的结点,这个时候的temp表示我们的待删除结点的前一个位置,这个时候我们的temp.next不就表示待删除结点