代碼片段:
pTail->pNext = pNew; // 1. 當前尾節點指向新節點
pNew->pNext = NULL; // 2. 新節點指針域置空 (成為新尾部標識)
pTail = pNew; // 3. 尾指針前移指向新節點
初始: Head[pNext=NULL] ← pTail
第1步: pTail->pNext = pNew
Head[pNext]──→ pNew[pNext=??]
第2步: pNew->pNext = NULL
Head[pNext]──→ pNew[pNext=NULL] (鏈表結尾標記)
第3步: pTail = pNew
Head[pNext]──→ pNew[pNext=NULL] ← pTail (尾指針更新)
pTail->pNext = pNew:**鏈接**。將原尾節點的 pNext 指向新分配的節點 pNew,使新節點掛入鏈表末端。此時 pNew 的 pNext 仍是垃圾值。pNew->pNext = NULL:**終結**。將新節點的指針域置 NULL,標記鏈表結束。這步必須在 pTail 移動前完成,否則鏈表斷裸。pTail = pNew:**推進**。尾指針 pTail 更新指向新節點,為下一次插入做準備。不移動尾指針,下輪插入會覆蓋原尾節點的 pNext,導致丟失新節點。Node* create_list() {
Node* pHead = (Node*)malloc(sizeof(Node)); // 頭節點 (不存數據)
pHead->pNext = NULL;
Node* pTail = pHead; // 尾指針初始指向頭節點
int len, val;
scanf("%d", &len);
for (int i = 0; i < len; ++i) {
scanf("%d", &val);
Node* pNew = (Node*)malloc(sizeof(Node));
pNew->data = val;
pNew->pNext = NULL; // 分配後即置空,安全
pTail->pNext = pNew; // 掛入
pTail = pNew; // 推進
}
return pHead; // 返回頭節點 (首元素為 pHead->pNext)
}
三步曲是單鏈表尾插法的核心不變式,理解指針指向變化即掌握鏈表構建本質。