我了解鏈表的作業原理,但這個特定的代碼對我來說很難掌握。
它的這個leetcode 問題(基本上我們得到了要洗掉的節點的地址),其解決方案可以像下面的代碼片段一樣實作:
1. class Solution {
2. public:
3. void deleteNode(ListNode* node) {
4. ListNode* next = node->next;
5. *node = *next;
6. delete next;
7. }
8. };
我知道:
&node將意味著節點變數的地址node表示存盤在稱為節點的地址處的值(資訊)*node用于解參考名為 node 的指標變數。
我的疑問:
- [IMP] 如果我們需要取消參考一個
node指標來獲取其資料(如第 5 行),那么為什么不在訪問其成員元素時也這樣做(第 4 行node->next)? - [不是IMP] 那么,怎么
*node復制*next的資料呢?
uj5u.com熱心網友回復:
node->next實際上相當于(*node).next. 所以那里已經有一個隱式取消參考。
至于復制,我假設您了解例如普通int變數之間的分配?如:
int a = 5;
int b = 10;
a = b;
很自然地將 的值b復制到a.
現在讓我們再次做同樣的事情,但有一個指向b:
int a = 5;
int b = 10;
int* pb = &b; // pb is pointing to b
a = *pb;
這確實與a = b.
另一個帶有指向的示例a:
int a = 5;
int b = 10;
int* pa = &a; // pa is pointing to a
*pa = b;
同樣,這與a = b.
現在把它們放在一起:
int a = 5;
int b = 10;
int* pa = &a; // pa is pointing to a
int* pb = &b; // pb is pointing to b
*pa = *pb;
它仍然與a = b.
指標是指向普通int變數或值,還是指向結構并不重要,它對所有指標都一樣。
uj5u.com熱心網友回復:
*node是傳入引數的物體,包括節點值和下一個地址。*node = *next是淺拷貝。如果ListNode比較復雜,淺拷貝可能會導致一些問題。推薦使用深拷貝。
ListNode在這兒:
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
這種方式更好理解:
class Solution {
public:
void deleteNode(ListNode* node) {
ListNode* next = node->next;
node->val = next->val;
node->next = next->next;
delete next;
}
};
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/324910.html
