當前位置:首頁 » 網路管理 » 遞歸刪除節點為什麼不會斷鏈
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

遞歸刪除節點為什麼不會斷鏈

發布時間: 2022-01-26 06:17:14

❶ 鏈表的刪除操作中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位元組,那麼這個塊邏輯執行足夠多次數,內存就放不下了。這就是隱患了。

(尤其處理的數據量級較大時,這個問題會比較明顯)