❶ 链表的删除操作中p->next=p->next->next 正确吗会不会在执行的过程中导致断链而找不到p-next-next
你有这个疑问可能是对赋值操作不太了解,赋值操作是这样的步骤:先计算等号右边的表达式,再计算等号左边的表达式,然后将右边的值赋给左边,所以p->next=p->next->next的步骤是先找到p节点的子节点的子节点地址,然后将其赋给p的next指针,不存在断链问题。
❷ 用引用传指针参数,为什么直接删除节点不会造成链表断链
传指针可以改变指针所指向的变量的值,指针的引用可以改变指针的值,即可以改变指针指向的变量。所以,链表中如果用指针的引用来删除结点的话会造成链表断链。
❸ 递归表删除,只得到一条数据删除下级节点及下下级。
public static void main(String[] args) {
String pid;//只得到一条数据的PID
List chilren = findChldren(pid);// 此children 是所有子节点了 写在事务里一起删除就可以了
}
//根据PID 找出 所有子节点(包括孙子节点...)
private List findChildren(String pid)
{
//通过传进来的PID 查找子节点集合 ;
List children = findChildrenByPid(pid);
if(children!=null&&children.size()>0){
for(Object c : children){
children.addAll(findChildren(c));
}
}
}
//根据PID找出子节点
private List findChildrenByPid(String pid){
}
❹ 关于递归删除链表节点为什么不会断链问题解释
/*
用递归实现对没有头结点的链表实现删除给定数字
输出最终结果
*/
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <cstdlib>
using namespace std;
typedef int ElemType;
const int MaxSize = 100;
typedef struct LNode{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
//递归删除链表节点函数
void Del_X_3(LinkList &L,ElemType x) {
LNode *p;
if(L == NULL) {
return;
}
if(L->data == x) {
p = L;
L = L->next;
free(p);
Del_X_3(L,x);
//printf("if2--> %d\n",L->data);
} else {
Del_X_3(L->next,x);
//printf("else--> %d\n",L->data);
}
//printf("--->%d\n",L->data);
}
int main(int argc,char **agrv) {
int n;
while(~scanf("%d",&n)) {
int x;
LinkList L = NULL;
LNode *s, *r = L;
for(int i = 0;i < n;++i) {
scanf("%d",&x);
s = (LNode *)malloc(sizeof(LNode));
s->data = x;
if(L == NULL) L = s;
else r->next = s;
r = s;
//printf("-->%u\n",r);
}
r->next = NULL;
printf("Please enter you want to delete number: ");
scanf("%d",&x);
LNode *p = L;
while(p) {
printf("%ox ",p);
p = p->next;
}
puts("");
Del_X_3(L,x);
// //test
p = L;
while(p) {
printf("%ox %d\n",p,p->data);
p = p->next;
}
puts("");
}
return 0;
}
先解决问题一:
对于非递归版本的删除链表结点,必须要知道其前驱结点。假设当前要删除的结点为p,前驱结点为q。修改代码如下:q->next = p->next;而从上面的代码可以看出,对于递归版本的程序并不需要特别的知道其前驱结点。
再解决问题二:
首先,我们要先明确一个问题。就是上面给出的程序是用引用的。这说明了函数是传址调用。这就是当删除一个结点时候,不用需要知道前驱结点也可以的根本所在。
给个例子模拟一下你就知道了:
3 //输入三个数
3 4 5
4 //删除4
模拟函数调用过程:
初始链表逻辑关系:3 --> 4 --> 5
1、从3结点开始: f(&L,4) ----> 这时候明显不是要删除的数。
所以调用else部分。
L1->next引用传址。(当前的L表示的是结点3)
2、4结点开始: f(&L,4) -----> 这时候发现4就是要删除的数。
调用if2部分
处理代码为:L2 = L2->next(发现问题吗?)
(L1和L2同表示L,为了好说明特别加以区别加了下标。)
其实,L2 == L1->next(即L1->next为结点3的next域)
而执行L2= L2->next现在就相当于把3的next域指向了5 的指针域。(L1->next = L2->next。所以,我们在这个 删除的过程中还是隐含的知道了要删除结点的前驱结点)
即,现在的逻辑关系变为:3->5
后面的就都一样了,就不在详说了。程序一直执行到if1 条件满足为止,然后开始递归返回值。最后终止。
而这个过程是传址的。所以,这回影响最终的结果。
❺ 用递归算法删除二叉树节点
删除结点之后加一句p=null;否则返回上一层时,上一层判断左右孩子是否为空时,肯定是不为空了嘛...加上就对了应该!
❻ 递归删除单链表值为x的节点,这样写法为何出错
delete head; 把头都砍掉了,链表还能活吗?
❼ 不带头结点的栈用递归删除值为x的元素 这道题的代码 怎么感觉会断链
这个问题我知道!算法有问题,第一个,链表遍历时必须保证每一个被遍历的元素都有先判断是否为空再访问,这个程序如果传进来的参数头结点是空,程序就中断了,而且头结点的data值是否为x都没有判断,还有那个p哪里来的
///这行用的是递归,在函数中调用本身,这里是相当于循环,可以去看看关于递归的知识
发现一个问题,你传进来的头结点L是一个结构体的引用,你用->怎么可能指的出来next,是要用点运算符才能访问吧,而且链表从头到尾都是指针,怎么会跑个结构体名出来?
❽ zookeeper+递归删除节点是怎么回事
1 是递归删除,简单来说,你看delete操作在destory之后,就是说先删除子节点(先删左子节点,后删右子节点),再删除自己。逐级回退删除。 2 这是插入左节点呀。二叉树构造就是靠不断的子节点(左右)插入来完成。 换句话说,插入子节点是构造
❾ 树的递归问题,关于结点的删除和插入
1 是递归删除,简单来说,你看delete操作在destory之后,就是说先删除子节点(先删左子节点,后删右子节点),再删除自己。逐级回退删除。
2 这是插入左节点呀。二叉树构造就是靠不断的子节点(左右)插入来完成。
换句话说,插入子节点是构造二叉树的一个环节。
“那它是怎么拉链的”,不明白你说啥。
❿ 求问个c语言问题,删除链表节点的时候 为什么要释放被删节点,不释放也不影响呀
如果不释放的话会造成内存泄露。
比如一个业务逻辑中需要不断的增加节点,并不断的删除节点,如果不释放节点的内存空间的话,假设每个节点占内存8字节,那么这个块逻辑执行足够多次数,内存就放不下了。这就是隐患了。
(尤其处理的数据量级较大时,这个问题会比较明显)